- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码尝试使用多部分传输、客户端信封加密和 Amazon KMS 服务处理数据加密 key ,将 17MB 的测试文件复制到 S3 存储桶。多部分块大小为 5MB。
在传输最后一个(部分) block 时,仅如果 IsLastPart
标志设置为 true
,调用 UploadPart
生成一个 System.Net.ProtocolViolationException
指示:要写入流的字节超过指定的 Content-Length 字节大小。
这表明 Content-Length html header 未更新以反射(reflect)加密引擎为正确对齐而添加到最后一个密码 block 的必要“填充字节”。结果,当添加这些最终字节时,它们超出了给定的 Content-Length 并生成了此错误。
如果 IsLastPart
未设置(即 false
),则操作成功,但下载和解密操作也失败。
注意:AWS .NET SDK 不提供 KmsAlgorithm
类。这个类来自另一个 Stack Overflow posting因为 AWS SDK 的 .NET 版本不提供 connector class在 KMS 和 S3 之间,以像 Java SDK 一样支持信封加密。
那么使用客户端加密和 KMS 托管 key 将分段上传发送到 S3 的正确方法是什么?
static string bucketName = "*****************************";
static string keyName = "test.encrypted.bin";
static string uploadSourcePath = "c:\\temp\\test.bin";
static long partSize = 5 * 1024 * 1024;
static String uploadId = "";
static void Main(string[] args)
{
if (checkRequiredFields())
{
String cmkId = "************************************";
// Prepare our KMS client and kmsAlgorithm
using (AmazonKeyManagementServiceClient kmsClient = new AmazonKeyManagementServiceClient())
using (KMSAlgorithm kmsAlgo = new KMSAlgorithm(kmsClient, cmkId))
{
// Generate the encryption materials object with the algorithm object
EncryptionMaterials encryptionMaterials = new EncryptionMaterials(kmsAlgo);
// Now prepare an S3 crypto client
using (AmazonS3EncryptionClient cryptoClient = new AmazonS3EncryptionClient(encryptionMaterials))
{
// Initiate the multipart upload request specifying the bucket and key values
InitiateMultipartUploadResponse initResp = cryptoClient.InitiateMultipartUpload(
new InitiateMultipartUploadRequest()
{
BucketName = bucketName,
Key = keyName
});
uploadId = initResp.UploadId;
long fileLength = new FileInfo(uploadSourcePath).Length;
long contentLength = fileLength;
long bytesRemaining = fileLength;
List<PartETag> partETags = new List<PartETag>();
int partNumber = 0;
while (bytesRemaining > 0)
{
long transferSize = bytesRemaining > partSize ? partSize : bytesRemaining;
long partIndex = fileLength - bytesRemaining;
partNumber++;
UploadPartResponse resp =
cryptoClient.UploadPart(
new UploadPartRequest()
{
BucketName = bucketName,
Key = keyName,
FilePath = uploadSourcePath,
FilePosition = partIndex,
PartSize = transferSize,
PartNumber = partNumber,
UploadId = uploadId,
IsLastPart = transferSize < AwsS3FileSystemSample1.Program.partSize
});
partETags.Add( new PartETag( partNumber, resp.ETag ));
bytesRemaining -= transferSize;
}
// Now complete the transfer
CompleteMultipartUploadResponse compResp = cryptoClient.CompleteMultipartUpload(
new CompleteMultipartUploadRequest()
{
Key = keyName,
BucketName = bucketName,
UploadId = initResp.UploadId,
PartETags = partETags
});
}
}
}
Console.WriteLine("Press any key to continue...");
Console.ReadKey();
}
如有任何错误,我们深表歉意。我们将不胜感激。
最佳答案
经过大量测试并在 AWS SDK for .NET 源代码的 git hub 上进行了一些代码探索后,神奇的 secret 是将 UploadPartRequest 的 PartSize 成员设置为零(0) 将 IsLastPart 成员设置为 true 时。
究竟为什么这有效是一个有争议的问题。由于最后一部分的数据通常由加密引擎填充以满足密码 block 边界,因此实际的内容长度在加密完成之前是未知的。或许将 PartSize 设置为零允许底层代码将 Content-Length 设置为密文的填充长度,而不是 PartSize 中给出的值>。为什么当 IsLastPart 设置为 true 时这不会自动完成是一个谜。
无论如何,以下摘要可能有所帮助。使用客户端加密和分段上传时,在上传对象数据的最后一部分时,将 PartSize 成员设置为零 (0) 并将 IsLastPart 设置为 true。
此代码片段可能会有所帮助。
while (bytesRemaining > 0)
{
long transferSize = bytesRemaining > partSize ? partSize : bytesRemaining;
long partIndex = fileLength - bytesRemaining;
bytesRemaining -= transferSize;
bool isLastPart = bytesRemaining == 0;
partNumber++;
UploadPartResponse resp =
cryptoClient.UploadPart(
new UploadPartRequest()
{
BucketName = bucketName,
Key = keyName,
FilePath = uploadSourcePath,
FilePosition = partIndex,
PartSize = isLastPart ? 0 : transferSize,
PartNumber = partNumber,
UploadId = uploadId,
IsLastPart = isLastPart
});
partETags.Add( new PartETag( partNumber, resp.ETag ));
}
我希望这对其他人有帮助。
关于c# - .NET 中带有 KMS 的 AWS S3 客户端加密在最后一部分传输时发出 ProtocolViolationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024051/
这个问题在这里已经有了答案: “return” and “try-catch-finally” block evaluation in scala (2 个回答) 7年前关闭。 为什么method1返
我有一个动态列表,需要选择最后一项之前的项目。 drag your favorites here var lastLiId = $(".album
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我想为每个线程执行特定操作,因此,我认为tearDown Thread Group 不起作用。 是否有任何替代方法可以仅在线程的最后一次迭代时运行“仅一次 Controller ”? 谢谢。 最佳答案
有没有可能 finally 不会被调用但应用程序仍在运行? 我在那里释放信号量 finally { _semParallelUpdates.Re
我收藏了 对齐的元素,以便它们形成两列。使用 nth-last-child 的组合和 nth-child(even) - 或任何其他选择器 - 是否可以将样式应用于以下两者之一:a)最后两个(假设
我正在阅读 Jon Skeet 的 C# in Depth . 在第 156 页,他有一个示例, list 5.13“使用多个委托(delegate)捕获多个变量实例化”。 List list = n
我在 AM4:AM1000 范围内有一个数据列表(从上到下有间隙),它总是被添加到其中,我想在其中查找和总结最后 4 个结果。但我只想找到与单独列相对应的结果,范围 AL4:AL1000 等于单元格
我最近编写了一个运行良好的 PowerShell 脚本 - 然而,我现在想升级该脚本并添加一些错误检查/处理 - 但我似乎被第一个障碍难住了。为什么下面的代码不起作用? try { Remove-
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
使用 Django 中这样的模型,如何检索 30 天的条目并计算当天添加的条目数。 class Entry(models.Model): ... entered = models.Da
我有以下代码。 public static void main(String[] args) { // TODO Auto-generated method stub
这个问题在这里已经有了答案: Why does "a == x or y or z" always evaluate to True? How can I compare "a" to all of
这个问题已经有答案了: Multiple returns: Which one sets the final return value? (7 个回答) 已关闭 8 年前。 我正在经历几个在工作面试中
$ cat n2.txt apn,date 3704-156,11/04/2019 3704-156,11/22/2019 5515-004,10/23/2019 3732-231,10/07/201
我可以在 C/C++ 中设置/禁用普通数组最后几个元素的读(或写)访问权限吗?由于我无法使用其他进程的内存,我怀疑这是可能的,但如何实现呢?我用谷歌搜索但找不到。 如果可以,怎样做? 因为我想尝试这样
我想使用在这里找到的虚拟键盘组件 http://www.codeproject.com/KB/miscctrl/touchscreenkeyboard.aspx就像 Windows 中的屏幕键盘 (O
我正在运行一个 while 循环来获取每个对话的最新消息,但是我收到了错误 [18-Feb-2012 21:14:59] PHP Warning: mysql_fetch_array(): supp
这个问题在这里已经有了答案: How to get the last day of the month? (44 个答案) 关闭 8 年前。 这是我在这里的第一篇文章,所以如果我做错了请告诉我...
我是一名优秀的程序员,十分优秀!