MD5 ハッシュを Base64 で求める方法
- アルゴリズム では MD5 があらかじめ選択されています。
- ファイルなら、入力 を ファイル に切り替えてドロップします。複数のファイルを一度にドロップすることもでき、それぞれに結果が出ます。200 MB を超えるファイルは 8 MB 単位で読み込まれ、進捗が % で表示されます。
- テキストなら、入力 を テキスト のままにして入力するか貼り付けます。入力の形式 を使えば、16進数や Base64 のデータを UTF-8 テキストではなく生のバイト列としてハッシュできます。
- ヘッダーや API には Base64 の値を、
md5sumの出力と比べるなら Hex をコピーします。どちらも同じ 16 バイトを表しています。
ツールには、MD5 はセキュリティ目的には向かないという短い警告が表示されます。これは事実ですが、チェックサムには影響しません。
16進数か Base64 か:同じ 16 バイト
| 入力 | MD5(16進数) | MD5(Base64) |
|---|---|---|
| 空 | d41d8cd98f00b204e9800998ecf8427e | 1B2M2Y8AsgTpgAmY7PhCfg== |
hello | 5d41402abc4b2a76b9719d911017c592 | XUFAKrxLKna5cZ2REBfFkg== |
The quick brown fox jumps over the lazy dog | 9e107d9d372bb6826bd81d3542a419d6 | nhB9nTcrtoJr2B01QqQZ1g== |
Content-MD5 で最もよくある間違いは、16進数のテキストを Base64 エンコードすることです。fox の文の場合、OWUxMDdkOWQzNzJiYjY4MjZiZDgxZDM1NDJhNDE5ZDY= という 44 文字になり、どのサーバーも受け付けません。長さを見ればすぐにわかります。24 文字なら正しく、44 文字なら誤って16進数をエンコードしています。
Base64 の MD5 が求められる場面
Content-MD5リクエストヘッダー(RFC 1864)。Amazon S3 はアップロード時にこれをチェックし、Azure Blob Storage も同様に、本文が一致しなければエラーを返します。- Google Cloud Storage はオブジェクトの
md5Hashを Base64 で報告し、gsutil hashも16進数を指定する-hを付けない限り Base64 で出力します。 - Azure Blob のプロパティ も
Content-MD5を Base64 で保存しています。 - 古い API やメールシステム:SHA ベースのチェックサムが登場する前にこのヘッダーを採用したもの。
16進数のままの場所もあります。md5sum や大半のダウンロードページ、それに S3 のシングルパートアップロードの ETag で、これは引用符で囲んだ16進数の MD5 です。マルチパートの S3 の ETag は - とパート数で終わり、そもそもファイル全体の MD5 ではないので、このツールの結果と一致することはありません。
コマンドラインとコードで MD5 を Base64 にする
openssl md5 -binary file.bin | base64
md5sum file.bin | cut -d' ' -f1 | xxd -r -p | base64
import base64, hashlib
with open("file.bin", "rb") as f:
digest = hashlib.file_digest(f, "md5").digest()
print(base64.b64encode(digest).decode())
hashlib.file_digest には Python 3.11 以降が必要です。それより古いバージョンでは、ファイルを分割して読み込んで update() を呼んでください。Node.js では、crypto.createHash("md5").update(buffer).digest("base64") で直接 Base64 の形式が得られます。新しい API が SHA-256 のチェックサムを提供しているなら、そちらを優先してください。SHA-256 を Base64 で で同じように値を求められます。ほかのスニペットは OpenSSL と Python のページにあります。
よくある質問
Content-MD5 ヘッダーとは何ですか?
RFC 1864 で定められた HTTP ヘッダーで、本文の 16 バイトの MD5 ダイジェストを Base64 にしたものを運びます。Amazon S3 や Azure Blob Storage などのストレージサービスは、転送中に壊れたアップロードを拒否するのにこれを使います。
Base64 の MD5 が 44 文字になるのはなぜですか?
16 バイトの生の値ではなく、32 文字の16進数の文字列をエンコードしたからです。正しい MD5 の Base64 は、常に == で終わる 24 文字です。エンコードする前に、バイナリ出力でハッシュしてください(OpenSSL なら -binary、Python なら .digest())。
MD5 の16進数のチェックサムを Base64 に変換するには?
16進数をバイト列にデコードし、それを Base64 エンコードします。9e107d9d372bb6826bd81d3542a419d6 は nhB9nTcrtoJr2B01QqQZ1g== になります。16進数を Base64 に変換 なら貼り付けるだけです。
MD5 は今でも安全に使えますか?
偶発的な破損の検出になら使えます。攻撃者が手を加えられるものには使えません。MD5 の衝突はノートパソコンで作れるので、異なる 2 つのファイルが同じハッシュを持ちうるからです。改ざんに対する整合性には SHA-256 を、パスワードには Argon2 や bcrypt などのパスワードハッシュを使ってください。