如何计算 S3 文件内容的 SHA-256 校验和
How to calculate SHA-256 checksum of S3 file content
开箱即用的S3提供S3对象内容的MD5校验和。但我需要计算文件内容的 SHA-256 校验和。该文件可能足够大,所以我不想将文件加载到内存中并计算校验和,而是我需要一个解决方案来计算校验和而不将整个文件加载到内存中。
可以通过Java中的步骤实现:
- 获取S3对象的InputStream
- 对 SHA-256 哈希(或 SHA-1 或 MD5)使用 MessageDigest 和 DigestInputStream 类
以下是有关操作方法的片段:
String getS3FileHash(AmazonS3 amazonS3, String s3bucket, String filePath) {
try {
InputStream inputStream = amazonS3.getObject(s3bucket, filePath).getObjectContent();
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
DigestInputStream digestInputStream = new DigestInputStream(inputStream, messageDigest);
byte[] buffer = new byte[4096];
int count = 0;
while (digestInputStream.read(buffer) > -1) {
count++;
}
log.info("total read: " + count);
MessageDigest digest = digestInputStream.getMessageDigest();
digestInputStream.close();
byte[] md5 = digest.digest();
StringBuilder sb = new StringBuilder();
for (byte b: md5) {
sb.append(String.format("%02X", b));
}
return sb.toString().toLowerCase();
} catch (Exception e) {
log.error(e);
}
return null;
}
开箱即用的S3提供S3对象内容的MD5校验和。但我需要计算文件内容的 SHA-256 校验和。该文件可能足够大,所以我不想将文件加载到内存中并计算校验和,而是我需要一个解决方案来计算校验和而不将整个文件加载到内存中。
可以通过Java中的步骤实现:
- 获取S3对象的InputStream
- 对 SHA-256 哈希(或 SHA-1 或 MD5)使用 MessageDigest 和 DigestInputStream 类
以下是有关操作方法的片段:
String getS3FileHash(AmazonS3 amazonS3, String s3bucket, String filePath) {
try {
InputStream inputStream = amazonS3.getObject(s3bucket, filePath).getObjectContent();
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
DigestInputStream digestInputStream = new DigestInputStream(inputStream, messageDigest);
byte[] buffer = new byte[4096];
int count = 0;
while (digestInputStream.read(buffer) > -1) {
count++;
}
log.info("total read: " + count);
MessageDigest digest = digestInputStream.getMessageDigest();
digestInputStream.close();
byte[] md5 = digest.digest();
StringBuilder sb = new StringBuilder();
for (byte b: md5) {
sb.append(String.format("%02X", b));
}
return sb.toString().toLowerCase();
} catch (Exception e) {
log.error(e);
}
return null;
}