在Amazon S3中为新对象引入默认数据完整性保护 新闻博客

Amazon S3 新对象的默认数据完整性保护

重点总结

  • 引入新特性 :Amazon S3 现在对新上传的对象默认启用数据完整性保护。
  • 有效性提升 :自动检测上传数据的完整性,确保用户发送的数据在传输过程中未被损坏。
  • 简化开发 :开发者无需修改现有代码,就能享受到自动计算和验证的完整性保护。

更新于2024年12月2日 :更新带有默认数据完整性保护的 SDK 将在未来几周内发布。

在 ,大多数新功能是基于您的直接反馈而推动的。 引入了额外的校验和算法和可选的客户端校验和计算功能,确保存储在 Amazon S3上的对象与您发送的一致。您告诉我们,您喜欢这种额外的验证,因为它增加了您对存储对象的信心。同时,您也希望将这种验证功能自动启用,从而免去开发额外代码的麻烦。

从今天开始,我们更新了 在上传对象时的默认行为。为了增强其现有的耐用性,Amazon S3现在会自动验证您的数据在从应用程序传输到 S3 存储桶的过程中被正确传送。

Amazon S3 设计的目标是提供99.999999999%的数据耐用性(也就是11个9)。在对象到达我们的服务器并在多个存储设备上写入之前,AmazonS3 一直通过计算校验和来验证对象上传的完整性。一旦您的数据存储在 Amazon S3中,它会通过定期检查静态数据的完整性来持续监控数据耐用性。此外,Amazon S3 还主动监控数据的冗余,以验证您的对象能够容忍多个存储设备的并发故障。

然而,在数据通过公共互联网传输到达我们的服务器时,数据仍可能面临完整性风险。在我们无法管理的网络上,硬件故障或客户端软件漏洞可能会导致数据在 AmazonS3 有机会验证之前被损坏或丢失。之前,您可以通过在

请求中提供您自己的预先计算的校验和来扩展完整性保护。但这需要配置工具和应用程序来生成与跟踪校验和,跨所有上传对象的客户端应用程序统一实施起来相对复杂。

新的默认行为在现有数据完整性保护的基础上进行扩展,而无需对应用程序进行任何更改。此外,新的校验和存储在对象的元数据中,可以随时访问以进行完整性验证。

自动客户端完整性保护

Amazon S3 现在默认将数据完整性保护扩展到客户端应用程序。最新版本的 会自动为每次上传计算基于循环冗余校验(CRC)的校验和,并将其发送到 AmazonS3。Amazon S3 在服务器端独立计算校验和,并在安全存储对象及其校验和之前验证该值。

当您的客户端应用程序未发送 CRC 正确性校验和(可能是因为使用了我们 SDK 的早期版本或尚未更新您的自定义代码)时,Amazon S3 无论如何会计算 CRC 基于的校验和,并将其存储在对象元数据中,以供今后参考。稍后,您也可以将存储的 CRC 与您自己计算的 CRC 进行比较,从而验证网络传输是否正确。

这一新功能为使用最新版本 AWS SDK、AWS 命令行界面 (AWS CLI) 和 上传的新文件提供了自动的校验和计算和验证。您也可以随时验证存储在对象元数据中的校验和。新的默认数据完整性保护使用现有的 。AmazonS3 还向开发者提供了一致的全对象校验和,用于单部分和多部分上传。

在以多部分上传文件时,SDK 会对每个部分计算校验和。Amazon S3 使用这些校验和通过 UploadPart API验证每个部分的完整性。此外,当您调用 CompleteMultipartUpload API 时,S3 还会验证整个文件的大小和校验和。

CreateMultiPartUpload API 引入了一个新的 HTTP 头 x-amz-checksum- type,允许您指定要使用的校验和类型。您可以选择使用完整对象校验和(通过组合所有单个部分的校验和计算)或复合校验和。

完整对象校验和与对象的元数据一起存储,以供将来参考。这一新保护与

无缝协作。在上传、多部分上传、下载和加密模式中的一致行为简化了客户端的完整性检查。能够使用全对象校验和来验证完整性并将其存储以备后用,能够帮助您优化应用程序。

看其实际应用

要开始使用这一额外的完整性保护,请更新到最新版本的 AWS SDK 或 AWS CLI。无需修改代码即可启用新完整性保护。

用例演示

案例 1 :当没有校验和被上传时,Amazon S3 现在在服务器端为对象附加校验和。

我编写了一个简单的 Python 脚本,用于向 S3 存储桶上传和下载内容。我启用了最大日志详细程度,以查看发送到 Amazon S3 的实际 HTTP标头。


BUCKET_NAME = "aws-news-blog-20241111" CONTENT = 'Hello World!' OBJECT_NAME =
'test.txt'

# 启用 boto3 和 botocore 的调试日志到标准输出(这很详细!!!)

logging.basicConfig(level=logging.DEBUG)

# 创建 S3 客户端

client = boto3.client('s3')

# 上传对象

client.put_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME, Body=CONTENT)

# 获取对象

response = client.get_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME)
print(response['Body'].read().decode('utf-8')) ```

在这个演示的第一步中,我使用了一个旧的 AWS SDK for Python,它不计算客户端的 CRC 校验和。尽管如此,我仍然可以观察到,AmazonS3 在接收到对象时返回了它计算的校验和。

`json S3 RESPONSE: { ... "x-amz-checksum-crc64nvme": "AuUcyF784aU=", "x-amz-
checksum-type": "FULL_OBJECT", ... }`

**案例 2** :使用手动预计算的 CRC64NVME 校验和上传。

当我无法使用 AWS SDK 的最新版本,或者我使用自己的代码上传对象到 S3 存储桶时,我可以计算校验和并将其作为参数发送。在此示例中,我使用新 AWSSDK for Python 中的 `checksums` 包来计算校验和:

```python from awscrt import checksums import base64

checksum = checksums.crc64nvme("Hello World!") checksum_bytes =
checksum.to_bytes(8, byteorder='big') # CRC64 是 8 字节 checksum_base64 =
base64.b64encode(checksum_bytes) print(checksum_base64) ```

当我运行时,看到 CRC64NVME 校验和与 Amazon S3 上一步返回的相同。

`bash $ python crc.py b'AuUcyF784aU='`

我可以将该校验和作为参数包含在 `PutObject` API 请求中。

`python response = s3.put_object( Bucket=BUCKET_NAME, Key=OBJECT_NAME,
Body=b'Hello World!', ChecksumAlgorithm='CRC64NVME',
ChecksumCRC64NVME=checksum_base64 )`

**案例 3** :最新 SDK 在客户端计算校验和。

现在,我再次运行上传和下载脚本。这次,我使用 AWS SDK for Python 的最新版本。我观察到 SDK 现在发送请求中的 CRC标头,响应也包含校验和。这样我可以轻松地比较请求和响应中的版本,以确保接收的对象是我发送的。

`json REQUEST: { ... "x-amz-checksum-crc64nvme": "AuUcyF784aU=", "x-amz-
checksum-type": "FULL_OBJECT", ... }`

在任何时候,我都可以请求对象的校验和,以验证我的本地副本的完整性,使用 `HeadObject` 或 `GetObject` API。

`python get_response = s3.get_object( Bucket=BUCKET_NAME, Key=OBJECT_NAME,
ChecksumMode='ENABLED' )`

响应对象包含 `HTTPHeaders` 字段中校验和。

`json { ... "x-amz-checksum-crc64nvme": "AuUcyF784aU=", "x-amz-checksum-type":
"FULL_OBJECT", ... }`

**案例 4** :使用新的基于 CRC 的全对象校验和进行多部分上传。

在通过 `CreateMultipartUpload`、`UploadPart` 和 `CompleteMultipartUpload` API上传大型对象时,最新版本的 SDK 会自动为您计算校验和。

如果您想通过已知内容校验和来验证数据的完整性,可以预先计算多部分上传的基于 CRC的全对象校验和,以简化客户端工具的使用。在使用全对象校验和进行多部分上传时,您不再需要在上传对象时跟踪每个部分的校验和。

```python

# 预计算的全对象 CRC64NVME 校验和

full_object_crc64_nvme_checksum = 'Naz0uXkYBPM='

# 开始多部分上传

create_response = s3.create_multipart_upload( Bucket=BUCKET_NAME,
Key=OBJECT_NAME, ChecksumAlgorithm='CRC64NVME', ChecksumType='FULL_OBJECT' )
upload_id = create_response['UploadId']

# 上传部分

uploaded_parts = []

# 第一部分

data_part_1 = b'0' * (5 * 1024 * 1024) # 最小部分大小 upload_part_response_1 =
s3.upload_part( Body=data_part_1, Bucket=BUCKET_NAME, Key=OBJECT_NAME,
PartNumber=1, UploadId=upload_id, ChecksumAlgorithm='CRC64NVME' )
uploaded_parts.append({'PartNumber': 1, 'ETag':
upload_part_response_1['ETag']})

# 第二部分

data_part_2 = b'0' * (5 * 1024 * 1024) upload_part_response_2 =
s3.upload_part( Body=data_part_2, Bucket=BUCKET_NAME, Key=OBJECT_NAME,
PartNumber=2, UploadId=upload_id, ChecksumAlgorithm='CRC64NVME' )
uploaded_parts.append({'PartNumber': 2, 'ETag':
upload_part_response_2['ETag']})

# 使用 FULL_OBJECT CRC64NVME 校验和完成多部分上传,以验证整个对象的完整性。

complete_response = s3.complete_multipart_upload( Bucket=BUCKET_NAME,
Key=OBJECT_NAME, UploadId=upload_id,
ChecksumCRC64NVME=full_object_crc64_nvme_checksum, ChecksumType='FULL_OBJECT',
MultipartUpload={'Parts': uploaded_parts} ) print(complete_response) ```

## **注意事项**

对于现有对象,在复制的时候会添加校验和。我们更新了 `CopyObject` API,以便您可以为目标对象选择所需的校验和算法。

这一新的客户端校验和计算已在最新版本的 AWS SDK 中实现。当您使用旧版 SDK 或不预先计算校验和的自定义代码时,Amazon S3会为所有新接收的对象计算校验和,并将其存储在对象的元数据中,即使对于多部分上传也是如此。

## **定价和可用性**

这一扩展的校验和计算和存储在所有  免费提供。

请立即更新您的 AWS SDK 和 AWS CLI,以便自动享受这一额外的数据传输完整性保护。

要了解更多关于 Amazon S3 的数据完整性保护,请访问

页面。



![Sébastien删除)

### 

Seb 自80年代中期首次接触 Commodore 64以来便开始编写代码。他激励开发者利用 AWS云的价值,运用他独特的热情、热忱、客户倡导、好奇心和创造力。其兴趣领域包括软件架构、开发工具和移动计算。如果您想向他推销产品,请确保该产品具有
API。您可以在Twitter上关注他 @sebsto。

Leave a Reply

Required fields are marked *