本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用校验和实现数据完整性保护
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) 扩展。
我们在两个请求阶段讨论校验和:上传对象和下载对象。
上传对象
您可以使用 S3Client 的 putObject 方法将对象上传到 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 使用 |
使用预先计算的校验和值
与请求一起提供的预先计算校验和值会禁用 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', ]);
注意
如果上传对象时没有使用校验和,则不会进行验证。