Cryptography

Hash Function

ハッシュ関数

Category: Cryptography / Updated: 2026-05-26

📖

Overview

ハッシュ関数(Hash Function)とは、任意の長さのデータを入力として受け取り、固定長の出力値(ハッシュ値、ダイジェスト)を生成する一方向関数です。同じ入力からは必ず同じハッシュ値が得られますが、ハッシュ値から元のデータを復元することは計算上不可能です。

暗号学的ハッシュ関数は、データの改ざん検知、パスワードの安全な保存、デジタル署名、ブロックチェーンなど、情報セキュリティのあらゆる場面で使用されています。現在の標準はSHA-256(SHA-2ファミリー)であり、次世代標準としてSHA-3も利用可能です。

入力データが1ビットでも異なれば、出力されるハッシュ値はまったく異なるものになります(アバランシェ効果)。この特性により、データの完全性検証に極めて有効な手段となっています。

🔬

Details

暗号学的ハッシュ関数に求められる性質

  • 一方向性(Preimage Resistance):ハッシュ値hから、h = H(m)となる入力mを見つけることが計算上困難
  • 第二原像耐性(Second Preimage Resistance):ある入力m1に対して、H(m1) = H(m2)となる別の入力m2を見つけることが困難
  • 衝突耐性(Collision Resistance):H(m1) = H(m2)となる任意の2つの異なる入力m1、m2を見つけることが困難

主なハッシュアルゴリズム

  • MD5:128ビット出力。1991年開発。衝突攻撃が実用レベルで可能となり、セキュリティ用途には非推奨
  • SHA-1:160ビット出力。2005年に理論的攻撃が発表され、2017年にGoogleがSHAttered攻撃で実用的衝突を実証。非推奨
  • SHA-2(SHA-256/384/512):現在の標準。SHA-256は256ビット出力で、TLS、ビットコインなどで広く使用
  • SHA-3(Keccak):2015年にNISTが標準化。SHA-2とは異なるスポンジ構造を採用し、多様性を確保
  • BLAKE2/BLAKE3:高速性を重視した設計。ファイルハッシュやKDFで採用が進む

ハッシュ関数の用途

パスワード保存では、パスワードそのものを保存せずハッシュ値を保存します。ただし、単純なハッシュでは辞書攻撃やレインボーテーブル攻撃に脆弱なため、ソルト(ランダム値の付加)とストレッチング(反復ハッシュ)を組み合わせた専用関数(bcrypt、Argon2、scrypt)を使用します。

データ完全性検証では、ファイルやソフトウェアのダウンロード時にハッシュ値を比較して改ざんがないことを確認します。Gitではすべてのコミットにハッシュ値が付与されており、リポジトリの完全性を保証しています。

HMAC(Hash-based Message Authentication Code)は、ハッシュ関数と秘密鍵を組み合わせたメッセージ認証コードで、データの完全性と認証を同時に提供します。APIの認証やJWTトークンなどで広く使用されています。

🛡️

Security Measures

  • 01
    SHA-256以上のアルゴリズムを使用:MD5やSHA-1はセキュリティ用途では使用しないでください。ファイルのチェックサムやデジタル署名にはSHA-256以上を使用し、将来に備えてSHA-3への移行も視野に入れましょう。
  • 02
    パスワード保存には専用関数を使用:パスワードのハッシュ化には汎用ハッシュ関数ではなく、Argon2id(推奨)、bcrypt、scryptなどのパスワードハッシュ専用関数を使用してください。これらは意図的に計算を遅くすることで総当たり攻撃を困難にします。
  • 03
    ソルトの適用:パスワードハッシュには必ずユーザーごとに異なるランダムなソルト(最低16バイト)を付加してください。ソルトはハッシュ値とともに保存します。これによりレインボーテーブル攻撃を無効化できます。
  • 04
    ハッシュ値のみでの認証を避ける:ファイルの改ざん検知でハッシュ値を使用する場合、ハッシュ値自体が改ざんされないようHMACや署名で保護してください。ハッシュ値単体では送信元の認証ができません。
  • 05
    レガシーシステムの移行計画:MD5やSHA-1を使用している既存システムは、SHA-256以上への移行計画を策定してください。特にデジタル証明書、コードサイニング、ファイル検証で使用されている場合は優先的に対応が必要です。
⚠️

Incidents

📋 LinkedIn パスワード漏洩事件(2012年)

2012年6月、LinkedInから約650万件(後に1億1700万件と判明)のパスワードハッシュが流出しました。パスワードはSHA-1でハッシュ化されていましたが、ソルトが使用されていなかったため、レインボーテーブル攻撃により大多数のパスワードが短期間で解読されました。この事件はソルト付きパスワードハッシュの重要性を世界に知らしめる契機となりました。

📋 SHAttered — SHA-1の実用的衝突攻撃(2017年)

2017年2月、GoogleとCWI Amsterdamの研究者らが、SHA-1ハッシュの実用的な衝突攻撃「SHAttered」を実証しました。内容の異なる2つのPDFファイルで同一のSHA-1ハッシュ値を生成することに成功しました。この攻撃には約110GPU年の計算資源(クラウドコストで約11万ドル)が必要でしたが、SHA-1の安全性の終焉を決定的にしました。これにより、Git、ブラウザの証明書検証、ソフトウェア署名などでSHA-1の廃止が加速しました。

📋 Flame マルウェアのMD5衝突攻撃(2012年)

2012年に発見された高度なマルウェア「Flame」は、MD5ハッシュの衝突攻撃を利用してMicrosoft Windows Updateの偽の証明書を作成していました。Windows Updateの証明書検証にMD5ハッシュが使用されていたことを悪用し、不正なコード署名証明書を生成して、マルウェアを正規のWindows更新プログラムに偽装させていました。国家レベルの攻撃者がハッシュ衝突を実戦投入した初の事例です。

🔗

Related Terms