ハッシュアルゴリズム比較:MD5、SHA-1、SHA-256、そしてその先へ
暗号学的ハッシュ関数は現代のコンピューティングの基盤です。ファイルの整合性検証、パスワードの保護、メッセージの認証、そしてブロックチェーン技術を支えています。しかし、すべてのハッシュアルゴリズムが同等に作られているわけではありません。このガイドでは、最も広く使われているアルゴリズムを比較し、適切な選択を支援します。
ハッシュ関数とは?
ハッシュ関数は任意のサイズの入力を受け取り、固定長の出力(「ダイジェスト」または「ハッシュ」)を生成します。優れたハッシュ関数には3つの重要な特性があります:
- 決定性:同じ入力は常に同じ出力を生成する
- 雪崩効果:入力のわずかな変更で出力が完全に変わる
- 一方向性:ハッシュから入力を逆算することは計算上不可能
これらの特性により、ハッシュはデータ整合性の検証やセキュリティアプリケーションに不可欠です。
アルゴリズム比較
| アルゴリズム | 出力サイズ | 速度 | セキュリティ状態 | 現在使用可能? |
|---|---|---|---|---|
| MD5 | 128 bits | 非常に高速 | 危殆化 | チェックサムのみ |
| SHA-1 | 160 bits | 高速 | 危殆化 | いいえ |
| SHA-256 | 256 bits | 中程度 | 安全 | はい |
| SHA-384 | 384 bits | 中程度 | 安全 | はい |
| SHA-512 | 512 bits | 64bitで高速 | 安全 | はい |
| SHA-3-256 | 256 bits | 中程度 | 安全 | はい |
| BLAKE2b | 256-512 bits | 非常に高速 | 安全 | はい |
| BLAKE3 | 256 bits | 極めて高速 | 安全 | はい |
MD5:危殆化した標準
MD5は1991年にRonald Rivestによって設計され、128ビットのハッシュを生成します。10年以上にわたり、チェックサムと整合性検証のデフォルトの選択肢でした。
MD5が危殆化した理由:2004年、研究者たちは実用的な衝突攻撃(同じハッシュを生成する2つの異なる入力を見つけること)を実証しました。2008年には、MD5の衝突を利用して不正なCA証明書が作成されました。現在では、一般的なハードウェアで数秒以内に衝突を発見できます。
MD5が許容される場合:改ざんが懸念されないファイルダウンロードの検証など、セキュリティに関係のないチェックサム。セキュリティに関連するものにはMD5を一切使用しないでください。
SHA-1:非推奨だが残存
SHA-1はNSAによって設計され、1995年に公開された160ビットのハッシュを生成します。長年にわたりMD5に代わる標準でした。
SHA-1が危殆化した理由:GoogleとCWI Amsterdamが2017年に実用的な衝突を実証しました(「SHAttered」攻撃)。主要ブラウザは2017年にSHA-1証明書のサポートを廃止しました。Gitは元々コミットハッシュにSHA-1を使用しており、SHA-256への移行を進めています。
現在の状態:すべてのセキュリティ目的で非推奨です。レガシーシステムでSHA-1に遭遇した場合は、SHA-256またはSHA-3への移行計画を立ててください。
SHA-256:現在の標準
SHA-256はSHA-2ファミリーに属し、NSAによって設計され2001年に公開されました。256ビットのハッシュを生成し、現在最も広く使われている安全なハッシュアルゴリズムです。
セキュリティ:SHA-256に対する実用的な攻撃は発見されていません。128ビットの衝突耐性を提供し、当面の間十分と考えられています。
パフォーマンス:SHA-256はMD5やSHA-1より低速ですが、パスワードハッシュに使用する場合はこれが利点となります(低速=ブルートフォースが困難)。ハードウェアアクセラレーション(SHA-NI命令)を持つ最新のCPUでは、優れたパフォーマンスを発揮します。
SHA-256の使用場所:
- TLS/SSL証明書
- Bitcoinマイニング
- デジタル署名
- コード署名
- ファイル整合性検証
当サイトのハッシュジェネレーターでSHA-256ハッシュを即座に生成できます。
SHA-3:代替標準
SHA-3はKeccakアルゴリズムに基づき、2012年にNISTのハッシュ関数コンペティションで優勝しました。SHA-2とは完全に異なる内部構造(スポンジ構造)を使用しています。
SHA-3が重要な理由:数学的なブレークスルーによりSHA-2が危殆化した場合、SHA-3は完全に独立したフォールバックを提供します。設計が異なるため、SHA-2の脆弱性がSHA-3に影響する可能性は低いです。
採用状況:SHA-2が未だ安全なため、SHA-3の採用は予想より遅れています。ブロックチェーンアプリケーションや多層防御アーキテクチャのセカンダリハッシュとして使用が増えています。
BLAKE2とBLAKE3:スピードチャンピオン
BLAKE2(2012年)とBLAKE3(2020年)は、セキュリティを損なうことなくパフォーマンスを追求した最新のハッシュ関数です。
BLAKE3の特徴:
- 最新のCPUでMD5より高速
- 本質的に並列処理可能(CPUコアに応じてスケール)
- 256ビット出力
- 鍵付きハッシュと鍵導出のビルトインサポート
速度が重要でNIST標準に制約されない場合、BLAKE3は優れた選択肢です。
適切なアルゴリズムの選択
パスワードハッシュ用
上記のいずれも直接使用しないでください。専用のパスワードハッシュ関数を使用してください:Argon2id(Password Hashing Competitionの優勝者)、bcrypt、またはscrypt。これらはブルートフォース攻撃に耐えるために意図的に低速でメモリハードに設計されています。詳しくはパスワードセキュリティガイドをご覧ください。
ファイル整合性検証用
SHA-256が標準的な選択です。パフォーマンスが重要で両方のエンドポイントを制御できる場合、BLAKE3はより高速で安全です。
デジタル署名用
必要なセキュリティレベルに応じてSHA-256またはSHA-384を使用します。政府機関や金融アプリケーションではSHA-384またはSHA-512が義務付けられることが多いです。
チェックサム用(非セキュリティ)
セキュリティが不要な場合はCRC32またはxxHashが高速です。暗号学的な保証が必要な場合、SHA-256が最低ラインです。
ブロックチェーンアプリケーション用
SHA-256(Bitcoin)、Keccak-256(Ethereum)、またはBLAKE2b(Zcash)。選択は特定のプロトコル要件に依存します。
ハッシュ衝突の解説
衝突は、2つの異なる入力が同じハッシュ出力を生成する場合に発生します。誕生日のパラドックスにより、衝突は予想よりはるかに速く発見されます:
- 128ビットハッシュ(MD5)の場合、衝突には約2^64の操作が必要
- 256ビットハッシュ(SHA-256)の場合、衝突には約2^128の操作が必要
この指数的な差により、ハッシュ長を2倍にすると、セキュリティは2倍をはるかに超えて向上します。
実践例
同じ入力を異なるアルゴリズムで処理した結果:
Input: "Hello, World!"
MD5: 65a8e27d8879283831b664bd8b7f0ad4
SHA-1: 0a0a9f2a6772942557ab5355d76af442f8f65e01
SHA-256: dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
当サイトのハッシュジェネレーターでご自身で生成してみてください。すべての計算はブラウザ内で行われ、データはプライベートに保たれます。
FAQ
SHA-256は量子耐性がありますか?
SHA-256は量子攻撃に対して部分的に耐性があります。Groverのアルゴリズムにより、原像攻撃の実効セキュリティが256ビットから128ビットに低下する可能性がありますが、それでも安全と考えられています。衝突耐性については、量子コンピュータの優位性は小さいです。ポスト量子暗号標準は、ハッシュ関数よりも暗号化と署名に焦点を当てています。
追加のセキュリティのためにSHA-256の代わりにSHA-512を使うべきですか?
ほとんどのアプリケーションでは、SHA-256で十分なセキュリティが得られます。SHA-512は内部構造により64ビットプロセッサでは実際にはより高速なため、パフォーマンス上の理由で良い選択となり得ます。追加のハッシュ長は衝突耐性を向上させますが、決定的な要因となることはほとんどありません。
関連リソース
- ハッシュジェネレーター — MD5、SHA-1、SHA-256、SHA-512ハッシュをオンラインで生成
- パスワードセキュリティガイド — パスワードの作成と保存のベストプラクティス
- JWTトークン解説 — ハッシュアルゴリズムがJSON Web Tokenをどのように保護するか