Amazon S3 数据完整性保护 - AWS SDKs 和工具

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 数据完整性保护

注意

如需了解设置页面布局或解释后面的 Support b y AWS SDKs 和 tools 表格的帮助,请参阅了解本指南的设置页面

一段时间 AWS SDKs 以来,一直支持在向亚马逊简单存储服务上传数据或从中下载数据时进行数据完整性检查。以前,这些支持采用选择加入方式。现在,我们使用基于 CRC 的算法(例如 CRC32 或 CRC64 NVME)默认启用了这些检查。尽管各个 SDK 或工具都有其默认的算法,不过您也可以选择其他的算法。您还可以选择继续手动为上传提供预先计算的校验和。上传、分段上传、下载和加密模式均使用一致的行为,简化了客户端完整性检查的过程。

我们的 AWS SDKs 最新版本 AWS CLI 会自动计算每次上传的基于循环冗余校验 (CRC) 的校验和,并将其发送到 Amazon S3。Amazon S3 会在服务器端独立计算校验和,并使用提供的值对其进行验证,然后才会将对象及其校验和持久地存储在对象的元数据中。通过将校验和与对象一起存储在元数据中,下载对象时将可以自动返回相同的校验和并用于验证下载。您也可以随时验证存储在对象元数据中的校验和。

要详细了解校验和操作、分段上传或支持的校验和算法列表,请参阅《Amazon Simple Storage Service 用户指南》中的在 Amazon S3 中检查对象完整性

分段上传:

Amazon S3 还为开发人员提供了涵盖单段上传和分段上传的一致完整对象校验和,。

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

如果您的 SDK 使用 Amazon S3 Transfer Manager 来协助分段上传,则将使用 Support AWS SDKs by 和工具 表中特定于 SDK 的默认算法来验证分段的校验和。您可以通过将设置设置设置为FULL_OBJECT或选择使用 CRC64 NVME 算checksum_type法来选择启用完整的对象校验和。

如果您使用的是较早版本的 SDK 或 AWS CLI:

如果您的应用程序使用 2024 年 12 月之前的软件开发工具包或工具,Amazon S3 仍会计算新对象的 CRC64 NVME 校验和,并将其存储在对象元数据中以备将来参考。您可以稍后将存储的 CRC 与您计算的 CRC 进行比较,验证网络传输是否正确。此外,您仍然可以通过 PutObjectUploadPart 请求提供自己预先计算的校验和来手动扩展完整性保护,这是早期版本中解决此问题的标准方法。

使用以下方法配置此功能:

request_checksum_calculation-共享 AWS config文件设置
AWS_REQUEST_CHECKSUM_CALCULATION - 环境变量
aws.requestChecksumCalculation-JVM 系统属性:仅限 Java/Kotlin

默认情况下,用户会在发送请求时选择启用请求校验和计算。用户可以在构建请求过程中选择任何一种可用的校验和算法。如果用户未进行选择,则将使用 SDK 特定的默认算法。有关各个 SDK 或工具的默认算法,请参阅 Support AWS SDKs by 和工具表。

默认值WHEN_SUPPORTED

有效值:

  • WHEN_SUPPORTED:在 API 操作支持时(例如向 Amazon S3 传输数据时)对所有请求有效载荷执行校验和验证。

  • WHEN_REQUIRED:仅在 API 操作要求时才执行校验和验证。

response_checksum_validation-共享 AWS config文件设置
AWS_RESPONSE_CHECKSUM_VALIDATION - 环境变量
aws.responseChecksumValidation-JVM 系统属性:仅限 Java/Kotlin

默认情况下,用户在发送请求时会选择启用执行响应校验和验证。计算响应有效载荷的校验和,并与校验和响应标头进行比较。如果校验和验证失败,则在读取有效载荷时会向用户发出错误。

校验和响应标头还会指示校验和的算法。对于所有支持校验和的 Amazon S3 API 操作,Amazon S3 客户端都会尝试验证响应校验和。但如果 SDK 尚未实现指定的校验和算法,则会跳过此验证。

默认值WHEN_SUPPORTED

有效值:

  • WHEN_SUPPORTED:在 API 操作支持时(例如向 Amazon S3 传输数据时)对所有响应有效载荷执行校验和验证。

  • WHEN_REQUIRED:仅在 API 操作支持且调用方已为该操作显式启用校验和时,才会执行校验和验证。例如,调用 Amazon S3 GetObject API 并且 ChecksumMode 参数设置为“启用”时。

Support AWS SDKs by 和工具

以下内容 SDKs 支持本主题中描述的功能和设置。所有部分例外情况均已注明。 AWS SDK for Java 和 适用于 Kotlin 的 AWS SDK 唯一支持任何 JVM 系统属性设置。

注意

在下表中,“CRT”是指 AWS 常用运行时 (CRT) 库,并且可能需要向您的项目添加其他依赖项。

SDK 支持 默认校验和算法 支持的校验和算法 备注或更多信息
AWS CLI v2 CRC64NVME CRC64NVME CRC32,, CRC32 C, SHA1 SHA256 对于 AWS CLI v1,默认算法和支持的算法将与 Python (Boto3) 相同。
适用于 C++ 的 SDK CRC64NVME CRC64NVME CRC32,, CRC32 C, SHA1 SHA256
适用于 Go V2 (1.x) 的 SDK CRC32 CRC64NVME CRC32,, CRC32 C, SHA1 SHA256
适用于 Go 1.x(V1)的 SDK
适用于 Java 2.x 的 SDK CRC32 CRC64NVME(仅通过 CRT)、 CRC32、 CRC32 C、 SHA1 SHA256
适用于 Java 1.x 的 SDK
适用于 JavaScript 3.x 的软件开发工具包 CRC32 CRC32, CRC32C, SHA1, SHA256
适用于 JavaScript 2.x 的 SDK
适用于 Kotlin 的 SDK CRC32 CRC32, CRC32C, SHA1, SHA256
适用于.NET 4.x 的 SDK CRC32 CRC32, CRC32C, SHA1, SHA256
适用于 .NET 3.x 的 SDK CRC32 CRC32, CRC32C, SHA1, SHA256
适用于 PHP 3.x 的 SDK CRC32 CRC32、 CRC32 C(仅通过 CRT)、、 SHA1 SHA256 awscrt需要扩展名才能使用 CRC32 C。
适用于 Python (Boto3) 的 SDK CRC32 CRC64NVME(仅通过 CRT)、 CRC32、 CRC32 C(仅通过 CRT)、、 SHA1 SHA256
适用于 Ruby 3.x 的 SDK CRC32 CRC64NVME(仅通过 CRT)、 CRC32、 CRC32 C(仅通过 CRT)、、 SHA1 SHA256
适用于 Rust 的 SDK CRC32 CRC64NVME CRC32,, CRC32 C, SHA1 SHA256
适用于 Swift 的 SDK CRC32 CRC64NVME CRC32,, CRC32 C, SHA1 SHA256 所有算法都需要 CRT 依赖项。
适用于 PowerShell V5 的工具 CRC32 CRC32, CRC32C, SHA1, SHA256
适用于 PowerShell V4 的工具 CRC32 CRC32, CRC32C, SHA1, SHA256