使用校验和实现数据完整性保护 - 适用于 PHP 的 Amazon SDK
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用校验和实现数据完整性保护

Amazon Simple Storage Service (Amazon S3) 允许您在上传对象时指定校验和。当您指定校验和时,校验和与对象一起存储,并且可以在下载对象时验证该校验和。

传输文件时,校验和可提供额外的数据层完整性。使用校验和,您可以通过确认收到文件与原始文件是否匹配来验证数据一致性。有关 Amazon S3 校验和的更多信息,请参阅 Amazon Simple Storage Service 用户指南,包括支持的算法

您可以灵活地选择最适合自己需求的算法,并让 SDK 计算校验和。或者,您也可以使用任一受支持的算法,提供预先计算好的校验和值。

注意

从版本的 3.337.0 开始 适用于 PHP 的 Amazon SDK,SDK 通过自动计算上传的CRC32校验和来提供默认的完整性保护。如果您未提供预先计算的校验和值,或者没有指定 SDK 计算校验和时应使用的算法,SDK 就会计算此校验和。

SDK 还提供数据完整性保护的全局设置,您可以在外部进行设置,您可以在Amazon SDKs 和工具参考指南中阅读这些设置。

重要

要使用该CRC32C算法,您的 PHP 环境需要安装 Amazon 公共运行时 (Amazon CRT) 扩展

我们在两个请求阶段讨论校验和:上传对象和下载对象。

上传对象

您可以使用 S3ClientputObject 方法将对象上传到 Amazon S3。使用参数数组中的 ChecksumAlgorithm 对来启用校验和计算并指定算法。

$client = new \Aws\S3\S3Client(['region' => 'us-east-2']); // See the note below. $result = $client->putObject([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', 'ChecksumAlgorithm' => 'CRC32', 'Body' => 'Object contents to test the checksum.' ]);

如果您未在请求中提供校验和算法,则校验和行为将根据您使用的 SDK 版本而异,具体如下表所示。

未提供校验和算法时的校验和行为

PHP SDK 版本 校验和行为
3.337.0 之前的版本 SDK 不会自动计算基于 CRC 的校验和,也不会在请求中提供该值。
3.337.0 或更高版本

SDK 使用 CRC32 算法计算校验和,并在请求中提供该值。Amazon S3 通过计算自己的 CRC32 校验和来验证传输的完整性,并将其与 SDK 提供的校验和进行对比。如果校验和匹配,则校验和将与对象一起保存。

使用预先计算的校验和值

与请求一起提供的预先计算校验和值会禁用 SDK 的自动计算,而是使用提供的值。

以下示例显示了具有预先计算的 SHA256校验和的请求。

use Aws\S3\S3Client; use GuzzleHttp\Psr7; $client = new S3Client([ 'region' => 'us-east-1', ]); // Calculate the SHA256 checksum of the contents to be uploaded. $contents = 'Object contents to test the checksum.'; $body = Psr7\Utils::streamFor($contents); $sha256 = base64_encode(Psr7\Utils::hash($body, 'sha256', true)); $result = $client->putObject([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', 'Body' => $body, 'ChecksumSHA256' => $sha256 ]);

如果 Amazon S3 确定指定算法的校验和值不正确,服务就会返回错误响应。

分段上传

您也可以将校验和用于分段上传。

如以下示例所示,在 MultipartUploader 构造函数params 数组中将校验和算法指定为键值对。

$s3Client = new S3Client([ 'region' => 'us-east-1' ]); $stream = fopen("/path/to/large/file", "r"); $mpUploader = new MultipartUploader($s3Client, $stream, [ 'bucket' => 'amzn-s3-demo-bucket', 'key' => 'key', 'params' => ['ChecksumAlgorithm' => 'CRC32'] ]);

下载对象

使用 getObject 方法下载对象时,在以下情况下,SDK 会自动验证校验和:ChecksumMode 键的值为 enabled

以下代码段中的请求引导 SDK 通过计算校验和并比较值来验证响应中的校验和。

$result = $client->getObject([ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'test-checksum-key', 'ChecksumMode' => 'enabled', ]);
注意

如果上传对象时没有使用校验和,则不会进行验证。