どのハッシュアルゴリズムを選ぶか|用途別の決定木
結論(決定木)
何の用途?
├── 認証・改ざん検知 → SHA-256(迷ったらこれ)
├── パスワード保存 → bcrypt / argon2(本ツールで作るのは間違い)
├── キャッシュキー・dedupe → SHA-256 または MD5(衝突気にしないなら)
├── Etag・短いfingerprint → MD5(短さ重視)
├── Gitと連携 → SHA-1
├── 暗号通貨・電子署名 → SHA-256以上(規格で固定)
└── 互換性のため指定された → 仕様に従う
「迷ったらSHA-256」が99%のケースで正解です。
アルゴリズム比較表
| アルゴリズム | 出力長 | 速度 | 衝突耐性 | 推奨用途 |
|---|---|---|---|---|
| MD5 | 128bit (32文字) | 速 | 破られている | キャッシュ、整合性(重要でない) |
| SHA-1 | 160bit (40文字) | 速 | 破られている | Git、レガシー互換 |
| SHA-256 | 256bit (64文字) | 中 | 強 | 一般推奨 |
| SHA-384 | 384bit (96文字) | 中 | 強 | TLS、高セキュリティ |
| SHA-512 | 512bit (128文字) | 中 | 最強 | 暗号、長期署名 |
1. 認証・改ざん検知
推奨: SHA-256
例: ダウンロードしたisoファイルが正規のものか確認。
sha256sum ubuntu-24.04.iso
# 公開値と比較
ハッシュ値計算ツール で同じ計算ができます。
MD5やSHA-1は使わないこと。攻撃者が同じハッシュを持つ別ファイルを作れる可能性があります。
2. パスワード保存
推奨: 本ツールではない
パスワードハッシュには bcrypt / argon2 / scrypt などの専用ハッシュを使います。SHA-256では不適切です。
理由:
- SHA-256は速すぎる(GPUで毎秒数億回計算可能)
- レインボーテーブル攻撃に弱い
- ソルト・ストレッチング機能を持たない
bcrypt等は意図的に遅く設計され、ソルトを内蔵します。本ツールは汎用ハッシュ生成用であり、パスワード保存には使わないでください。
3. キャッシュキー・deduplication
推奨: SHA-256(または MD5)
「同じデータかを判定するキー」が欲しいだけなら、衝突攻撃は問題になりません(攻撃者が衝突を作っても意味がない)。
- 速度重視: MD5
- 念のため安全: SHA-256
- 長期保存: SHA-256
ファイル重複排除(ストレージ節約)でも同様。データの重複検出ならMD5で十分実用的ですが、SHA-256でも速度は気にならないことが多いです。
4. Etag・短いfingerprint
推奨: MD5
HTTPのEtagヘッダ、画像URLのキャッシュバスター(?v=abc123)など、短い識別子として使う場面。
ETag: "5d41402abc4b2a76b9719d911017c592"
ここはセキュリティ要件がないため、短くて速いMD5が現役。SHA-1の40文字でもOK。
5. Gitと連携
必須: SHA-1
Gitはオブジェクトの識別にSHA-1を使っています(一部SHA-256への移行も進行中)。Gitと整合性を取るには SHA-1 を使うしかありません。
$ git hash-object README.md
e8c01f7c5e9c12345...
これはGitの仕様で決まっているため、選択の余地なし。
6. 暗号通貨・電子署名
仕様で固定
| 規格 | 使うハッシュ |
|---|---|
| Bitcoin | SHA-256(2回適用) |
| Ethereum | Keccak-256(SHA-3とは少し違う) |
| TLS 1.3 | SHA-256 / SHA-384 |
| JWS(JWT署名) | RS256 / ES256 等で SHA-256 |
「自分で選ぶ」のではなく、プロトコルが指定するアルゴリズムを使います。本ツールでもSHA-256/SHA-384/SHA-512に対応しているので、これらとの突き合わせは可能です。
7. SHA-256 と SHA-512、どちらを選ぶ?
両方とも安全ですが:
| 観点 | SHA-256 | SHA-512 |
|---|---|---|
| 出力長 | 64文字 | 128文字 |
| 速度(64bit CPU) | やや遅 | やや速 |
| ストレージ | 半分 | 倍 |
| 標準採用 | 主流 | 一部 |
SHA-512の方が64bit CPUでは速いという事実があります(内部演算が64bitベース)。ただし出力が長いため、ストレージ・帯域が気になる場面では SHA-256。
実運用では「SHA-256で十分、長期署名で安心が欲しいならSHA-512」と覚えておけばOK。
SHA-384 はどんなとき?
SHA-512を計算してから先頭384bit(96文字)を切り出した版。
- TLS 1.3で使用される
- SHA-256より長く、SHA-512より短い「ちょうどいい」サイズ
特に理由がなければSHA-256かSHA-512を選び、プロトコル指定がある場合のみSHA-384、というのが実務感覚です。
SHA-3 はどこ?
SHA-3 は SHA-2(256/384/512)とは別の設計で、内部構造が異なります。本ツールでは未対応です。SHA-2 系で十分なケースがほとんどで、SHA-3 が要求されるのは特定の規格(Ethereum Keccak-256 など)に限られます。
関連記事
迷ったら SHA-256。これが鉄板です。