安全なハッシュ(MD5、SHA-1、SHA-256、SHA-512)を生成する方法
用途に合ったハッシュアルゴリズムの選び方、クリックひとつでのファイル整合性確認、キャッシュキーならMD5でもよいがパスワードは危険、という理由の整理です。

なぜ重要か
4 GBのISOを落としました。「成功」と出ましたが途中でWi-Fiが不安定だった。1ビットでも反転していないか。SHA-256を計算し、発行者の公開ダイジェストと突き合わせます。一致すればバイト完全一致、しなければ再取得。この考え方はコンテンツアドレスストレージ(GitのオブジェクトDB、IPFS)、バックアップの重複排除、ビルドパイプラインの改ざん検知にも共通します。
実際の3つのシーン
ファイルをツールへドロップし、プロジェクトリリースページのSHA-256と比較します。
バイナリが本物である自信
正準化済みリクエスト文字列をMD5して固定長キーにします。
衝突なくヒット
押収ファイルに対しSHA-512を計算し、案件ログへ。後から改変されていれば一目瞭然です。
チェーンオブカストディ記録
手順
ハッシュジェネレーターを開きます。
テキストかファイル入力を選ぶ
テキストは文字列を貼り、ファイルはディスクからドロップ。サイズに応じブラウザ内でローカルハッシュします(メモリの範囲内)。
アルゴリズムを選ぶ
MD5(速い・セキュリティ用途には破られた)、SHA-1(非推奨)、SHA-256(現代の標準)、SHA-512(長いダイジェスト・必須では稀)。
ダイジェストを読む
既定はhex。宛先がBase64ならトグルします。
既知値と比較する
期待値を比較欄へ貼ると一致/不一致が強調表示されます。
コピーしてログに残す
ファイルパスとタイムスタンプと一緒に保存し、後で再検証します。
入力
The quick brown fox jumps over the lazy dogダイジェスト
MD5 : 9e107d9d372bb6826bd81d3542a419d6
SHA-1 : 2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
SHA-256 : d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
SHA-512 : 07e547d9586f6a73f73fbac0435ed76951218fb7d0c8d788a309d785436bbb64...
実践テクノ
- 公開ダイジェストは必ずTLS保護ページからコピーし、フォーラム転載は避けます。なければ中間者がファイルとハッシュ両方すり替えられます。
- 既定はSHA-256。 広く対応され、現代CPUでは速く、出力64 hex はURLやログに収まります。
- パスワードにはbcrypt/scrypt/argon2。 SHAは速すぎてパスワードハッシュ向きではありません。遅いアルゴリズムは機能です。
- 正準形をハッシュする。 JSONリクエストをハッシュするときは先にキー順を正規化(テキストフォーマッター)し、キャッシュキーを安定させます。
よくある落とし穴
よくある誤り
2つのファイルでMD5が同じだが大丈夫?
無作為ファイルどうしのMD5衝突は計算上まだ稀です。敵対的に衝突ファイルを作られる文脈ではMD5は破られています。SHA-256へ。
よくある誤り
末尾改行だけでハッシュが違う
hexビューワや長さで確認します。典型は\r\n対\n。プラットフォームが違うならハッシュ前に改行を正規化します。
よくある誤り
巨大ファイルのSHA-512でブラウザが固まる
Webワーカーを使ってもマルチGB級ではタブが重くなります。他タブを閉じるか、sha256sumなどCLIへ。
向いていない用途
- ファイルの暗号化—鍵つきcipherが必要で、ハッシュだけでは保密できません。
- パスワード保存—ソルト付き低速KDF(bcryptなど)へ。
- 認証付きメッセージダイジェスト—鍵と組み合わせたHMAC。HMACのチュートリアルを参照。
FAQ
MD5とSHA-1は完全に無用?
セキュリティ以外(キャッシュキー、重複排除、ETag)なら問題ありません。入力を細工される相手がいるならSHA-256以上を。
Windowsのファイルハッシュが大文字?
大小は見た目だけです。hex比較は大文字小文字を区別しないで構いません。
ファイルをドロップするとアップロードされる?
いいえ。ブラウザのFile APIで読み、WebCrypto SubtleCrypto.digest()に流します。サーバー送信はありません。
次のステップ
- 共有鍵でメッセージへ署名するならHMACジェネレーター。
- ハッシュ対象がBase64/Hexなら先にエンコード/デコード。
- APIリクエストの端到端検証にはパラメータ署名。