ハッシュ関数 - ハッシュ関数(SHA-256 等)
任意長のデータから固定長のハッシュ値を生成する一方向関数。パスワード保存やデータ整合性の検証に使われる。
概念図
実例
SHA-256 でハッシュ値を生成
bash
echo -n "password123" | sha256sumファイルの整合性チェック用ハッシュを生成
bash
sha256sum largefile.isoどこで使われているか
ハッシュ関数は「データの指紋」を作る技術として、セキュリティのあらゆる場面で使われています。
- パスワード保存: データベースにパスワードを平文で保存せず、ハッシュ値のみを保存する
- ファイル整合性チェック: ダウンロードしたファイルが改ざんされていないかを SHA-256 で検証する
- デジタル署名: 署名対象のデータをハッシュ化してから秘密鍵で署名する
- Git: コミットやオブジェクトの一意な識別に SHA-1(将来は SHA-256)を使用
- ブロックチェーン: 前ブロックのハッシュを含めることでチェーンの改ざんを検知
使わなかった場合のリスク
- パスワードの平文漏洩: データベースが侵害されると、全ユーザーのパスワードがそのまま流出する
- 改ざんの見逃し: ファイルやメッセージが途中で書き換えられても検知できない
- 弱いハッシュの使用: MD5 や SHA-1 は衝突攻撃が実証済みで、偽のデータに同じハッシュ値を持たせることが可能
ハッシュ関数の特性と種類
ハッシュ関数には以下の性質があります。
- 一方向性: ハッシュ値から元のデータを復元できない
- 衝突耐性: 異なるデータから同じハッシュ値が生成されにくい
- 雪崩効果: 入力が 1 ビット変わるとハッシュ値が大きく変化する
主なアルゴリズム:
- SHA-256 / SHA-3: 現在推奨されるハッシュ関数
- MD5: 128 ビット。衝突が発見されており、セキュリティ用途には不適切
- SHA-1: 160 ビット。衝突攻撃が実証済みのため非推奨
- bcrypt / Argon2: パスワードハッシュ専用。意図的に計算コストを高くしている
パスワードハッシュのベストプラクティス
- ソルトの付加: ユーザーごとにランダムなソルトを付加してからハッシュ化する。レインボーテーブル攻撃を防ぐ
- ストレッチング: ハッシュ計算を数千~数万回繰り返す。ブルートフォース攻撃のコストを上げる
- 専用アルゴリズムの使用: パスワード保存には SHA-256 ではなく bcrypt, scrypt, Argon2 を使う
- SHA-256 の用途: ファイルの整合性チェック、デジタル署名、ブロックチェーンなどのデータ完全性の検証に使う
