ハッシュ生成・HMAC・ファイルのチェックサム

テキストのハッシュ・HMAC生成とファイル検証

テキストのハッシュ・HMAC生成とファイル検証

0 文字
MD5—
SHA-1—
SHA-256—
SHA-512—

ハッシュ生成・HMAC・ファイルのチェックサムについて

このツールには3つのモードがあります。テキストハッシュは入力をUTF-8のバイト列にしてMD5・SHA-1・SHA-256・SHA-512をまとめて計算します。HMACは秘密鍵とメッセージからHMAC-SHA-1/256/384/512を作り、16進数かBase64で表示します。ファイルチェックサムはファイルを8MBずつ読みながらCRC32・MD5・SHA-1・SHA-256・SHA-384・SHA-512から選んだものを同時に計算し、貼り付けた期待値と照合します。

3つとも材料は同じハッシュ関数ですが、答える問いが違います。チェックサムは「受け取ったファイルは公開されたものと同じか」、HMACは「鍵を持つ相手が作ったメッセージで、途中で改ざんされていないか」。素のハッシュでは後者に答えられず、どれもパスワード保存には使えません。

1バイト違えばダイジェストは全部変わる

出力長はMD5が128ビット(16進32文字)、SHA-1が160ビット(40文字)、SHA-256が256ビット(64文字)、SHA-512が512ビット(128文字)で、入力の長さに関係なく固定です。「hello」と「Hello」のSHA-256は先頭から違います。

見た目が同じでもバイトが違えば別の値になります。多いのは改行です。ターミナルで echo hello | md5sum とするとechoが末尾に改行を付けるのでb1946ac9…になり、このツールにhelloだけ入れると5d41402a…になります。WindowsのCRLF、コピー時に紛れた空白、濁点付き仮名のNFC/NFD正規化の違い(macOSのファイル名で起きやすい)も同じずれを生みます。

MD5とSHA-1は「破られた」——何が破られたのか

ハッシュに求める性質は3つです。ダイジェストから入力を見つけられないこと(原像耐性)、あるファイルと同じダイジェストを持つ別ファイルを作れないこと(第二原像耐性)、同じダイジェストになる任意の2入力を見つけられないこと(衝突耐性)。MD5とSHA-1で崩れたのは3つ目です。

MD5の衝突は2004年に王小雲(Wang Xiaoyun)らが発表し、RFC 6151(2011年)は2006年頃にはノートPCで約1分で衝突が見つかったと記しています。SHA-1は2017年2月、CWIアムステルダムとGoogleがSHAtteredとして同じSHA-1値を持つ2つのPDFを公開しました。計算量は約900京回のSHA-1計算、CPU 6,500年分とGPU 110年分です。2020年にはLeurentとPeyrinが、両入力の先頭を攻撃者が選べる選択プレフィックス衝突を約7万5千ドルのGPUレンタルで実証しました。NISTは2022年12月、SHA-1を2030年12月31日までに廃止するよう発表しています。

衝突攻撃が効くのは、攻撃者が両方の文書を用意できる場面です。無害な契約書と不利な契約書を同じハッシュにして、無害な方に署名させるといった使い方です。一方、既に公開されたファイルと同じハッシュの偽物を新たに作る第二原像攻撃は、MD5でも実用的な方法は知られていません。ダウンロードの破損確認ならMD5でも今のところ問題なく、配布側が悪意を持ちうる状況で真正性を確かめるならSHA-256を使います。

ファイルチェックサム:一致して分かること、分からないこと

配布ページのSHA256SUMSをそのまま貼り付けられます。GNU形式(ハッシュ、空白2つ、ファイル名)とBSD形式(SHA256 (ファイル名) = ハッシュ)を読み、複数行ならドロップしたファイル名と同じ行を優先します。タグがなければ長さで推定します(8文字CRC32、32文字MD5、40文字SHA-1、64文字SHA-256、96文字SHA-384、128文字SHA-512)。

一致は「このページに載った値と同じファイルを持っている」という意味にすぎません。攻撃者が配布サーバーを乗っ取りファイルとチェックサムを一緒に差し替えれば、やはり一致します。Linuxディストリビューションがチェックサム一覧にGPG署名を付けるのはこのためで、署名検証まで行って初めて発行元と結び付きます。このツールはダイジェストの比較までです。

CRC32は暗号学的ハッシュではなく、ZIPやPNG、イーサネットで伝送誤りを検出する符号です。末尾4バイトを調整して任意のCRC32にするのは簡単な計算でできるので、偶発的な破損の確認にだけ使ってください。

HMAC:SHA-256(鍵+メッセージ)ではだめな理由

API署名やWebhook検証で「秘密を先頭に付けてハッシュすればよい」と考えがちですが、MD5・SHA-1・SHA-256はMerkle–Damgård構造で、伸長攻撃(length extension)を受けます。ダイジェストが内部状態そのものなので、H(秘密‖メッセージ)とメッセージ長が分かれば、秘密を知らなくてもH(秘密‖メッセージ‖パディング‖追加データ)を計算できます。「&amount=9999」を後ろに付けたリクエストの正しい署名を偽造できるということです。

HMAC(RFC 2104)は鍵を2種類のパッド(ipad 0x36、opad 0x5c)と混ぜ、内側と外側で2回ハッシュします。外側が内側の結果を包むため伸長攻撃は通りません。同じ理由でHMAC-MD5やHMAC-SHA-1は衝突攻撃の影響をほとんど受けませんが、RFC 6151は新しいプロトコルにHMAC-MD5を入れないよう勧めています。

鍵欄の入力はテキストをUTF-8にしたものです。サービスが鍵を16進やBase64の文字列で渡す場合、デコードしたバイトが鍵なのか文字列そのままが鍵なのかは仕様次第なので確認してください。ブロック長(SHA-256は64バイト、SHA-384/512は128バイト)を超える鍵は、規格どおり先にハッシュされます。

パスワードをここでハッシュして保存しない

MD5やSHA系は速く計算できるよう設計されています。数GBのファイル検証には長所ですが、パスワードには短所で、漏えいしたハッシュを持つ攻撃者が膨大な候補を試せます。「password」のMD5である5f4dcc3b5aa765d61d8327deb882cf99は検索するだけで元の文字列が出てきます。保存にはソルトとコスト係数を持つbcrypt・scrypt・Argon2を使います。

例

改行ひとつの差

入力
テキストモード、MD5:hello / hello+改行
結果
5d41402abc4b2a76b9719d911017c592 / b1946ac92492d2347c6235b4d2611184

後者はLinuxで echo hello | md5sum を実行した結果と同じです。サーバー側の値と合わないときは末尾の改行と空白をまず疑ってください。

HMAC-SHA256の定番例

入力
鍵:key / メッセージ:The quick brown fox jumps over the lazy dog
結果
hex f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 / Base64 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg=

テキストモードで「keyThe quick…」とつなげてSHA-256すると51729876…になります。鍵を前置したハッシュとHMACはまったく別の値です。

ISOファイルの検証

入力
ファイルチェックサムにISOをドロップし、SHA256SUMSを丸ごと貼り付け
結果
ファイル名が一致する行の64文字をSHA-256で照合し、一致/不一致を表示

数GBのファイルも8MBずつ読むのでメモリ消費は小さく済みます。不一致ならダウンロードの中断か、別バージョンの取得が多い原因です。

使い方

  1. 上のタブでテキストハッシュ・HMAC・ファイルチェックサムを選びます。
  2. テキスト、または鍵とメッセージを入力するか、ファイルをドロップします。
  3. ファイルモードでは配布元のチェックサムを貼り付けて照合します。
  4. 結果横のボタンでコピーします。

主な用語

衝突
異なる2入力が同じダイジェストになること。攻撃者が両方を選べるならMD5・SHA-1で実際に作れます。
伸長攻撃
H(秘密‖メッセージ)から秘密を知らずにH(秘密‖メッセージ‖追加)を計算する攻撃。HMACとSHA-3には効きません。
CRC32
伝送誤り検出用の32ビット符号。意図的な改ざんは防げません。

よくある質問

MD5は復号できますか?

ハッシュは暗号化ではないので復号するものがありません。短い・よくある入力なら大量の候補をハッシュして照合する方法で見つかります。当サイトのハッシュ逆算ツールはその方式です。

SHA-256とSHA-512はどちらを使えば?

安全性はどちらも十分です。相手システムに合わせるならそれに従ってください。公開チェックサムはSHA-256が最も一般的です。

公開値が大文字で、自分の値は小文字です。

16進数は大文字小文字を区別しません。ツールは小文字にそろえて比較します。

ファイルモードでSHA-512も確認できますか?

はい。ファイルモードはCRC32・MD5・SHA-1・SHA-256・SHA-384・SHA-512に対応しています。SHA512SUMSの内容を貼り付けると長さ(128文字)で判別し、SHA-512を自動でオンにします。ただしブラウザ内で実装したSHA-512はSHA-256より3〜4倍遅く、数GBのファイルでは1分以上かかることがあります。

Webhookの署名が一致しません。

ほとんどの場合、送信側が署名した生のボディと入力が違います。JSONを一度パースして文字列に戻すと空白やキー順が変わるので、受信したそのままのボディを使ってください。

関連ガイド

出典

基準日:

プライバシーとデータの扱い