调用AWS S3 get-object-attributes接口无法获取文件SHA1校验和
核心原因
S3的SHA1、CRC32/CRC32C、SHA256这类额外校验和,不是所有对象默认自带的属性。2022年上线的是额外校验和的功能支持,不代表S3会自动给所有存量、新上传的对象计算全量哈希值——只有上传对象时显式指定了对应校验和算法、要求S3计算存储对应哈希的对象,调用接口传Checksum参数才能拿到对应值。
你传ETag能正常返回,是因为ETag是S3所有对象默认生成的内置属性,和额外校验和的生成逻辑完全独立,不存在依赖关系。
解决步骤
- 先排查目标对象的上传配置:如果是2022年校验和功能上线前就存到桶里的存量对象,或者新上传时没有加
--checksum-algorithm SHA1参数指定要计算SHA1的对象,本身就没存对应的哈希值,接口自然不会返回相关字段。 - 要给现有对象补上SHA1校验和,不需要重新上传本地文件,直接在S3侧执行同对象复制即可,参考命令:
aws s3api copy-object \ --bucket <bucketName> \ --copy-source <bucketName>/<fileName> \ --key <fileName> \ --checksum-algorithm SHA1 \ --metadata-directive COPY
- 复制操作完成后,再执行你之前写的
get-object-attributes命令,返回结果里就会出现ChecksumSHA1字段,对应的值就是你要的SHA1哈希。 - 注意:如果目标对象是分片上传的,直接拿到的校验和是各分片哈希按规则拼接后计算的结果,不是单文件整体的SHA1,需要对照你上传时的分片大小逐块计算拼接后,才能和本地文件的哈希值匹配。
内容的提问来源于stack exchange,提问作者Georgi Stoyanov
相关产品推荐
相关产品推荐

