✨ ソルト(Salt):同じパスワードでも異なるハッシュに
ソルトはハッシュ化の前にパスワードに付加するランダムな値です。パスワードハッシュの保存において必須の技術です。
ソルトなし(危険):
SHA256("password123") = ef92b778... (常に同じ→レインボーテーブルで即座に解読)
ソルトあり(安全):
ユーザーA: SHA256("password123" + "xK9m2p") = a3f7c891...
ユーザーB: SHA256("password123" + "qR5n8w") = 9f2d4b67... (同じパスワードでも異なるハッシュ)
ソルトは秘密にする必要はありません。パスワードのハッシュと一緒にDBに保存します。重要なのは「ユーザーごとに異なるランダムなソルト」を使うことで、レインボーテーブル攻撃を無効化することです。
🔸 鍵ストレッチング(Key Stretching):あえて遅くする
SHA-256は意図的に「高速」に設計されています。これはパスワードハッシュには逆効果です——高速なハッシュ関数はブルートフォース攻撃も高速になります。
鍵ストレッチングとは、ハッシュ計算を何千〜何十万回繰り返すことで、一回の試行コストを増やし総当たり攻撃を現実的でなくする手法です。
📊 現代のパスワードハッシュアルゴリズム比較
- bcrypt:ソルト内蔵・コストパラメータで計算時間を調整。1999年設計。現在も広く使用
- scrypt:メモリとCPUを両方消費→GPUやASICでの並列攻撃を抑制
- Argon2id:2015年のPassword Hashing Competition優勝。CPU・メモリ・並列度を設定可能。NIST推奨
- PBKDF2:繰り返しHMACによるKDF。FIPSに準拠が必要な場面で使用
🔸 HMAC:改ざん検知のための鍵付きハッシュ
HMAC(Hash-based Message Authentication Code)は、共有秘密鍵とハッシュ関数を組み合わせたメッセージ認証コード(MAC)です。
HMAC-SHA256(key, message) = Hash(key XOR opad || Hash(key XOR ipad || message))
通常のハッシュとの違い:
- 通常ハッシュ:「データが変わっていないか」の検証(誰でも検証可能)
- HMAC:「秘密鍵を知っている特定の人がデータを送ってきた」ことも検証できる
HMACの用途:APIの署名(AWS、Stripe等)・JWT(JSON Web Token)・TLSの完全性検証・パスワードリセットリンクの検証など。
🔸 KDF(鍵導出関数):1つのパスワードから複数の鍵を生成
KDF(Key Derivation Function)は、パスワードや共有秘密から暗号化に必要な長さ・形式の鍵を導出する関数です。
- HKDF(HMAC-based KDF):TLS 1.3・SSH・Signalプロトコルで使用。「抽出(extract)」と「展開(expand)」の2段階で高品質な鍵を生成
- PBKDF2:パスワード→鍵への変換。繰り返しHMACで計算コストを増加

ソルト・ストレッチング・HMAC・KDFはどれも「アルゴリズムは正しくても、使い方でもっと安全にする」ための技術ね。暗号設計は奥が深いから、信頼できるライブラリを使って正解の組み合わせを利用するのが一番だよ🐾
📌 まとめ
- ソルト:ユーザーごとにランダムな付加値でレインボーテーブル攻撃を無効化
- 鍵ストレッチング:繰り返しハッシュで計算コストを増やし総当たり攻撃を困難に
- Argon2id:CPU・メモリ・並列度の三方向でGPU攻撃も抑制。現在の最推奨
- HMAC:共有秘密鍵付きのハッシュで「誰が送ったか」の検証も可能
- KDF(HKDF等):少量の乱数から暗号用の長い鍵を安全に導出する