AWS S3 の新しいチェックサムアルゴリズム(SHA-256)を AWS SDK (JavaScript) から検証してみた

2022-04-14

はじめに

Amazon S3、データの整合性確認を最大90%高速化。新たなオブジェクトのチェックサムアルゴリズム追加で - Publickey という記事を読んだのがきっかけです。
これまででも MD5 による検証ができたらしいのですが、今回はじめて知りせっかくなので SHA-256 でチェックするとどうなるのか検証してみました。

検証に使ったサンプルコード

Gist で作りました。
https://gist.github.com/mryhryki/83d071d428aa6b40fc7574a00083206c

実行結果

アップロード時に SHA256 のハッシュ値が一致しない場合はエラーになることを検証できました。

$ npm start

> start
> esbuild --platform=node --external:node:* --bundle --minify --outfile=./index.js ./get_secret.ts && node ./index.js


  index.js  6.3mb ⚠️

⚡ Done in 121ms
--------------------------------------------------------------------------------
1. Upload with valid checksum
SUCCESS!
--------------------------------------------------------------------------------
2. Upload with INVALID checksum
ERROR: The SHA256 you specified did not match the calculated checksum.
--------------------------------------------------------------------------------
3-1. Create multipart upload
SUCCESS!
--------------------------------------------------------------------------------
3-2. Upload 1st part with valid checksum
SUCCESS!
--------------------------------------------------------------------------------
3-3. Upload 2nd part with INVALID checksum
ERROR: The SHA256 you specified did not match the calculated checksum.
--------------------------------------------------------------------------------
3-4. Upload 2nd part with valid checksum
SUCCESS!
--------------------------------------------------------------------------------
3-5. Complete multipart
SUCCESS!
--------------------------------------------------------------------------------
4. List Bucket
SUCCESS!
* Object1: multipart-upload.txt (10485760 Bytes)
* Object2: valid-checksum.txt (1024 Bytes)

試してみたこと

  1. PutObject で SHA-256 による検証を指定した場合
  2. マルチパートアップロード で SHA-256 による検証を指定した場合

試せなかったこと

CompleteMultipartUpload でチェックサムを指定できるようなのですが、パート毎にチェックした場合は全体のハッシュ値を検証できないようでした。

When objects are uploaded to Amazon S3, they can either be uploaded as a single object or through the multipart upload process. Objects that are larger than 16 MB and uploaded through the console are automatically uploaded using multipart uploads. For more information about multipart uploads, see Uploading and copying objects using multipart upload.

おわりに

重要なデータをアップロードする際に使うと良さそうだな、と思いました。