暗号学的ハッシュ関数とは?基礎概念・安全性属性・主要アルゴリズム(SHA-2/3・BLAKE)と実務設計ガイド
暗号学的ハッシュ関数とは──概要と基本概念
暗号学的ハッシュ関数(cryptographic hash function)は、任意長の入力(メッセージ)を固定長のビット列(ハッシュ値、ダイジェスト)に一方向的に写像する関数です。入力のわずかな変更が出力に大きな変化を生じさせ、元の入力をハッシュ値から復元することが事実上不可能である点が特徴です。ハッシュ関数はデータ整合性検査、電子署名、パスワード保護、メッセージ認証、ブロックチェーンなど、幅広い暗号プロトコルやシステムの基礎を成します。
必須の安全性性質
- 第一事前像耐性(Preimage resistance):与えられたハッシュ値 h について、そのハッシュ値を生み出す入力 x を見つけることが困難であること(1st preimage)。
- 第二事前像耐性(Second-preimage resistance):既知の入力 x1 に対して、同じハッシュ値を与える異なる入力 x2(x2 ≠ x1)を見つけることが困難であること。
- 衝突耐性(Collision resistance):任意の x1 ≠ x2 で H(x1)=H(x2) となるペア(衝突)を見つけることが困難であること。一般に衝突探索の計算量はビット長 n に対し約 2^(n/2)(誕生日攻撃の原理)とされます。
代表的なハッシュ関数と現状
- MD5:かつて広く使われたが、衝突が実用的に生成可能なため現在は非推奨。
- SHA-1:歴史的に広く利用されたが、2017年に実用的な衝突が生成された(「SHAttered」)ため署名用途などでは廃止が進んでいる。
- SHA-2(SHA-224/256/384/512):FIPSで規定された家族。現在も広く用いられている。
- SHA-3(Keccak):スポンジ構造を採用する新しい標準。長さ拡張攻撃の影響を受けない。
- BLAKE2/BLAKE3:高速で安全性の高い設計を目指した関数。BLAKE3 は並列化と性能に優れる。
内部構造の違い(例)
古典的な設計では Merkle–Damgård 構造が用いられ、入力はブロック単位で圧縮関数により処理されます。Merkle–Damgård 系は長さ拡張攻撃(length extension)に弱いことがあります。一方、SHA-3 の Keccak スポンジ構造はこの種の脆弱性を回避します。
実際の利用例と注意点
- データ整合性検査:ダウンロードファイルの整合性確認やソフトウェア配布でのハッシュ公開。
- デジタル署名:署名するのは通常メッセージのハッシュ。ここで衝突が可能だと署名の非否認性・信頼性が損なわれる。
- パスワード保存:単純なハッシュは危険。必ずソルト(ランダム値)を付与して、さらに計算コストを上げるための KDF(bcrypt、scrypt、Argon2、PBKDF2 等)を用いる。
- メッセージ認証(MAC):HMAC(ハッシュを鍵付きで用いる)により、長さ拡張攻撃や改竄防止を実現。
- ブロックチェーン・Merkle Tree:ハッシュ値を用いたハッシュツリーにより、効率的な検証や改竄検出を行う。ビットコインでは SHA-256 を二重に用いる(double SHA-256)。
攻撃手法とリスク
- 衝突探索(Birthday attack):出力長 n に対し約 2^(n/2) の計算で衝突が見つかる確率が現実的に上がる。
- 実例:MD5 の衝突攻撃や、SHA-1 の実用的衝突(2017)の公開は、古いハッシュ関数の脆弱性を示した。
- 長さ拡張攻撃:Merkle–Damgård 型の関数では H(m) と m の長さを知れば、H(m || pad || m2) を生成可能で、単純なハッシュ認証に問題を生じる。HMAC はこれを防ぐ。
- サイドチャネル・タイミング攻撃:実装の比較や早期リターンによりハッシュの利用箇所で情報漏洩を招く可能性。
- 量子計算の影響:グローバーのアルゴリズムにより事前像探索の計算量は二乗根に削減され、n ビット出力の事前像強度は概念的に n/2 ビット相当になる。衝突耐性に対する量子効果は異なるが、既知の量子アルゴリズムは古典よりも優れる結果をもたらすため、十分な出力長(例:256 ビット以上)が推奨される。
設計と実装上のベストプラクティス
- 既存の検証されたライブラリ(OpenSSL, libsodium, BoringSSL など)を利用し、自分でハッシュを実装しない。
- パスワード保護には Argon2(現行で最良クラスのメモリ消費型KDF)、bcrypt、scrypt を検討。PBKDF2 は互換性のために残すが、メモリ消費が小さい点で抵抗力に差がある。
- ハッシュだけで認証を行わない(HMAC や署名を用いる)。
- 古い関数(MD5、SHA-1)は新規システムでは使用しない。SHA-2(256/384/512)または SHA-3、BLAKE 系を優先。
- ソルトはランダムで十分な長さにし、各パスワードごとにユニークにする。必要に応じて「ペッパー(固定秘密)」を併用するが運用管理に注意。
- ハッシュサイズ・セキュリティレベルを文書化し、将来の移行計画を用意しておく(アルゴリズムが破られた場合の更新手順)。
数学的直感:誕生日のパラドックスとビット長の目安
出力が n ビットであれば、衝突を見つけるための計算量は古典的には O(2^(n/2))、事前像探索は O(2^n) 程度です。従って衝突耐性を保つためには、例えば 128 ビット衝突耐性を期待するならば出力 256 ビットのハッシュ(SHA-256 等)が適切です。量子計算を考慮すると事前像強度はほぼ半分になるため、長い出力(256 ビット以上)が推奨されます。
実務上の注意点とチェックリスト
- 用途に応じたアルゴリズム選定(データ整合性 vs パスワード vs MAC vs ブロックチェーン)。
- 既知の脆弱性が公表されたアルゴリズムは速やかに置換する。SHA-1/MD5 の使用を停止。
- ハッシュ値の比較は定数時間比較関数を使いタイミング攻撃を防ぐ。
- ハッシュの公開により情報が露出しうるケース(例:パスワードハッシュの漏洩)を想定し、適切な難読化や運用を行う。
まとめ
暗号学的ハッシュ関数は、多くの暗号プロトコルやシステムの基盤となる重要なツールです。しかし「ハッシュ」と一口に言っても設計原理や脆弱性、用途ごとの適切な使い方が異なります。古いアルゴリズム(MD5、SHA-1)は実用的攻撃により安全でなくなっており、新しい標準(SHA-2/3、BLAKE 系)や適切なKDF・HMACの組合せ、検証済みライブラリの利用が不可欠です。将来の量子の進展も見据えて、出力長や移行計画を含む堅牢な設計を行ってください。
参考文献
- FIPS PUB 180-4: Secure Hash Standard (SHS) — NIST (SHA-2)
- FIPS PUB 202: SHA-3 Standard — NIST
- RFC 2104: HMAC — IETF
- RFC 8018: PKCS #5: Password-Based Key Derivation Function 2 (PBKDF2) — IETF
- Google Security Blog: Announcing the first SHA-1 collision (SHAttered) — 2017
- Marc Stevens et al., SHAttered collision paper and resources
- Wang et al., Collisions for MD5 and other practical cryptanalysis papers
- BLAKE3 公式サイト(設計と実装情報)
- RFC 7914: scrypt — IETF
- Argon2 仕様(Password Hashing Competition)


