亚马逊AWS官方博客

新增功能 – 适用于 Amazon S3 的其他校验和算法

Amazon Simple Storage Service (Amazon S3) 旨在为您的对象以及与您的对象关联的元数据提供 99.999999999%(11 个 9)的持久性。您可以放心的是,S3 会准确存储您放入的内容,并且会准确返回您获取时存储的内容。为了确保正确地来回传输对象,S3 会使用校验和,后者基本上来说是一种数字指纹。

S3 的 PutObject 函数已经允许您传递对象的 MD5 校验和,并且仅在您提供的值与 S3 计算的值相匹配时才接受该运算。虽然这允许 S3 检测数据传输错误,但这确实意味着您需要在调用 PutObject 之前或调用 GetObject 之后计算校验和。此外,计算大型(多 GB 甚至多 TB)对象的校验和可能需要大量计算,并可能导致出现瓶颈。实际上,一些大型 S3 用户已经构建了专门用于计算和验证校验和的特殊用途 EC2 机群。

新的校验和支持
今天,我很高兴向您介绍 S3 对四种校验和算法的新支持。现在,您可以非常轻松地计算和存储 Amazon S3 中存储的数据的校验和,并使用校验和来检查上载和下载请求的完整性。您可以使用这项新功能来实施特定于您所在行业的数字保护最佳实践和控制措施。尤其是,在将每个对象上载到 S3 时,您可以指定使用四种广泛使用的校验和算法( SHA-1SHA-256CRC-32CRC-32C )中的任何一种。

以下是此项新功能的主要方面:

对象上载 – 最新版本的 AWS 开发工具包会在上载过程中计算指定的校验和,并在上载结束时将其包含在 HTTP 尾部。您还可以选择提供预先计算的校验和。无论使用哪种方式,如果请求中的值与 S3 计算的值匹配,S3 都会验证校验和并接受运算。结合使用 HTTP 尾部,此功能可以大大加快客户端完整性检查的速度。

分段对象上传 – AWS 开发工具包现在利用客户端并行机制,并为分段上传的每个部分计算校验和。所有分段的校验和本身都已经过校验和,且这些校验和的校验和在上载完成时均被传输到 S3。

校验和存储和持久性 – 经过验证的校验和以及指定的算法作为对象元数据的一部分进行存储。如果为对象请求使用 KMS 密钥进行服务器端加密,则校验和将以加密形式存储。算法和校验和在对象的整个生命周期中始终保持不变,即使它更改了存储类别或被更新的版本取代也是如此。它们还作为 S3 复制的一部分进行传输。

校验和检索 – 新的 GetObjectAttributes 函数返回对象以及每个部分(如果适用)的校验和。

校验和的实际应用
您可以通过 AWS 命令行界面 (CLI)AWS 开发工具包S3 控制台访问此功能。在控制台中,我在准备上载对象时启用了其他校验和选项:

然后我选择了一个校验和函数

如果我已经计算了校验和,我可以输入它,否则控制台将计算它。

上载完成后,我可以查看对象的属性以查看校验和:

S3 清单报告中还列出了每个对象的校验和函数。

根据我自己的代码,开发工具包可以为我计算校验和:

with open(file_path, 'rb') as file:
    r = s3.put_object(
        Bucket=bucket,
        Key=key,
        Body=file,
        ChecksumAlgorithm='sha1'
    )

或者我可以自己计算校验和并将其传递给 put_object

with open(file_path, 'rb') as file:
    r = s3.put_object(
        Bucket=bucket,
        Key=key,
        Body=file,
        ChecksumSHA1='fUM9R+mPkIokxBJK7zU5QfeAHSy='
    )

当我检索对象时,我指定了校验和模式来指示我想要验证返回的对象:

r = s3.get_object(Bucket=bucket, Key=key, ChecksumMode='ENABLED')

当我从 r['Body'] 读取对象时,会发生实际的验证,如果不匹配,将会引发异常。

观看演示
以下这些新功能实际应用的显示(首次在 2021 年 re:Invent 大会上展示):

 

现已推出
这四个额外的校验和现已在所有商用 AWS 区域中提供,您现在即可开始使用它们,且无需额外付费。

Jeff