如何检查已上传到 Amazon S3 的对象的完整性?
上次更新日期:2021 年 1 月 5 日
我想将对象上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。另外,我想验证已上传对象的完整性。该如何操作?
简短描述
请按照以下步骤使用 MD5 校验和值验证已上传对象的完整性:
注意:实体标签 (ETag) 是对象的哈希,而对象可能不是该对象数据的 MD5 摘要。ETag 是否为 MD5 摘要取决于创建和加密对象的方式。由于 ETag 并非总是 MD5 摘要,因此它不可能始终用于验证所上传文件的完整性。
1. 获取对象的 base64 编码的 MD5 校验和值。
2. 在上传期间验证对象的完整性。
解决方法
获取对象的 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 s3api put-object 命令:
aws s3api put-object --bucket awsexamplebucket --key awsexampleobject.txt --body awsexampleobjectpath --content-md5 examplemd5value1234567==
确保包含 --content-md5 选项,然后输入计算出的 base64 编码 MD5 校验和值。
或者,如果您想将 MD5 校验和值存储为元数据(自定义 HTTP 标头),也可以使用--metadata 选项,类似于以下内容:
aws s3api put-object --bucket awsexamplebucket --key awsexampleobject.txt --body awsexampleobjectpath --content-md5 examplemd5value1234567== --metadata md5checksum=examplemd5value1234567==
如果 Amazon S3 在上传期间计算的校验和与您为 --content-md5 输入的值不匹配,则 S3 将不会存储对象。相反,您将在响应中收到一条错误消息。有关更多信息,请参阅 AWS CLI 是否验证校验和?
注意:当您运行 AWS 命令行界面 (AWS CLI) 命令时,请确保您运行的是最新版本的 AWS CLI。