15分で読めます

ハッシュ関数とは?暗号学的ハッシュの仕組みを解説

ログイン、ファイル検証、Gitのcommit、Bitcoin、デジタル署名など、ハッシュ関数は多くのセキュリティ技術を支えています。ここでは仕組み、代表的なアルゴリズム、実務での注意点を整理します。

ハッシュ関数とは?

ハッシュ関数とは、任意の長さの入力から固定長の出力を生成するアルゴリズムです。この出力はハッシュ値digestfingerprintとも呼ばれます。

同じ入力からは常に同じハッシュ値が得られます。一方で、入力が1文字変わるだけでも出力は大きく変化します。そのため、データが改ざんされたか、ファイルが壊れていないかを確認する用途に向いています。

Input: Hello
SHA-256: 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

Input: hello
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

暗号学的ハッシュ関数は一方向関数として設計されます。入力からハッシュ値を計算するのは簡単ですが、ハッシュ値から元の入力を直接復元するのは現実的ではありません。

暗号学的ハッシュの5つの性質

  • 決定性: 同じ入力は常に同じ出力になる。
  • 高速性: 通常の入力に対して素早く計算できる。
  • 一方向性: ハッシュ値から元データを復元しにくい。
  • 衝突耐性: 同じハッシュ値になる別入力を見つけにくい。
  • Avalanche effect: 入力の小さな変化が出力全体を大きく変える。

ハッシュ化の仕組み

多くのハッシュアルゴリズムは、入力を一定サイズのブロックに分け、paddingを追加し、内部状態を何度も更新しながら最終的なdigestを作ります。SHA-256なら出力は常に256ビットです。

重要なのは、ハッシュ化は暗号化ではないという点です。復号鍵はなく、元データへ戻す操作もありません。

ハッシュアルゴリズム比較

アルゴリズム出力長状態用途
MD5128-bit安全ではないセキュリティ目的では使わず、非攻撃的なchecksum用途に限定する
SHA-1160-bit安全ではない証明書、署名、新規システムでは避ける
SHA-256256-bit安全で広く利用ファイル整合性、署名、ブロックチェーン、一般的な用途に向く
SHA-384384-bit安全より大きなsecurity marginが必要なシステム向け
SHA-512512-bit安全64-bit CPUで高速なことが多く、長いdigestが必要な用途に向く
SHA-3複数サイズ安全SHA-2とは異なる構造を持つ標準アルゴリズム群

衝突攻撃とは?

衝突とは、異なる2つの入力が同じハッシュ値になることです。理論上、入力空間は無限に近く、出力長は固定なので衝突は必ず存在します。安全なハッシュでは、その衝突を現実的な計算量で見つけられないことが重要です。

MD5とSHA-1は衝突攻撃が実証されているため、署名、証明書、セキュリティ判定には使うべきではありません。

パスワードハッシュ、salt、key stretching

パスワード保存では、単純なSHA-256だけでは不十分です。攻撃者は高速に大量の候補を試せるため、saltを追加し、Argon2、bcrypt、scrypt、PBKDF2のようなパスワード専用アルゴリズムで計算コストを高くします。

saltは同じパスワードでも異なるハッシュにするためのランダム値です。key stretchingは計算を意図的に遅くし、総当たり攻撃を難しくします。

HMACによる認証

HMACは、秘密鍵とハッシュ関数を組み合わせてメッセージの改ざん検出と送信者確認を行う仕組みです。API webhookの署名、JWTのHS256、リクエスト署名などで使われます。

実際の用途

  • ダウンロードファイルの整合性確認
  • デジタル署名と証明書
  • Gitのcommitやオブジェクト識別
  • ブロックチェーンのproof-of-workやトランザクションID
  • キャッシュキー、重複検出、データfingerprint

Hash、Encryption、Encodingの違い

Hashは一方向で元に戻せません。Encryptionは鍵を使って暗号化し、復号できます。EncodingはBase64やURL encodingのように形式を変換するだけで、秘密性はありません。

ベストプラクティス

  • 新規システムではMD5とSHA-1をセキュリティ用途に使わない。
  • 一般的な整合性確認や署名にはSHA-256以上を使う。
  • パスワード保存にはArgon2、bcrypt、scrypt、PBKDF2など専用方式を使う。
  • メッセージ認証には単純なhashではなくHMACを使う。
  • ハッシュ値を秘密情報として扱わない。必要に応じてsaltやkeyを使う。

Hashをオンライン生成

テキストや値のSHA、MD5などを確認したい場合は、ブラウザ上でハッシュ値を生成できます。

Hash Generatorを開く