如何检查已上传到 Amazon S3 的对象的完整性?

上次更新时间:2019 年 9 月 23 日

我想将对象复制到 Amazon Simple Storage Service (Amazon S3) 存储桶。另外,我想验证已上传对象的完整性。该怎样做? 

简短描述

请按照以下步骤使用 MD5 校验和值验证已上传对象的完整性:

注意:实体标签 (ETag) 是对象的哈希,而对象可能不是该对象数据的 MD5 摘要。ETag 是否为 MD5 摘要取决于创建和加密对象的方式。由于 ETag 并非总是 MD5 摘要,因此它不可能始终用于验证所上传文件的完整性。

1.    获取对象的 base64 编码的 MD5 校验和值。

2.    在上传期间验证对象的完整性。

解决方法

重要提示:此解决方法使用 Content-MD5 标头来验证对象的完整性。如果您的上传已使用 AWS 签名版本 4 进行签名,则您需要改用 x-amz-content-sha256 标头。有关更多信息,请参阅 AWS CLI 是否验证校验和?

获取对象的 base64 编码的 MD5 校验和值

如果您使用的是 Windows 操作系统,请执行以下步骤:

1.    安装 File Checksum Integrity Verifier (FCIV) 实用程序

2.    使用此命令运行 FCIV 实用程序:

fciv.exe c:\S3\testfile

3.    响应包含十六进制格式的校验和值,类似于以下内容:

fciv C:\Windows\explorer.exe
                //
                // File Checksum Integrity Verifier version 2.05.
                //
                example111aaa222bbb33cc44dd5e6f7 c:\\windows\\explorer.exe

4.    将十六进制 MD5 校验和值转换为其 base64 编码的格式。作为获取 base64 编码的格式的一个选项,请参阅使用 FCIV 实用程序的数据库存储格式

如果您使用的是 Linux 操作系统,请运行此 Open SSL 命令:

openssl md5 -binary PATH/TO/FILE | base64

响应包含 base64 编码的 MD5 校验和值,类似于以下内容:

user@example:/home$ openssl md5 -binary /bin/bash | base64
                examplemd5value1234567==

在上传期间验证对象的完整性

要在将对象上传到 Amazon S3 期间验证其 MD5 校验和值,请使用 AWS 命令行界面 (AWS CLI) 命令 aws s3api put-object 并包含 --content-md5 选项。对于 --content-md5 的值,输入您计算的 base64 编码的 MD5 校验和值,类似于以下内容:

aws s3api put-object --bucket awsexamplebucket --key awsexampleobject.txt --body awsexampleobjectpath --content-md5 examplemd5value1234567==

(可选)如果您想将 MD5 校验和值存储为元数据(自定义 HTTP 标头),也可以在命令中添加 --metadata 选项,类似于以下内容:

aws s3api put-object --bucket awsexamplebucket --key awsexampleobject.txt --body awsexampleobjectpath --content-md5 examplemd5value1234567== --metadata md5checksum=examplemd5value1234567==

如果 Amazon S3 在上传期间计算的校验和与您为 --content-md5 输入的值不匹配,则 Amazon S3 将不会存储对象。相反,您将在响应中收到一条错误消息。有关更多信息,请参阅 AWS CLI 是否验证校验和?