saltとは何か?事前計算されたハッシュ攻撃を打ち破る
saltは値がハッシュ化される前に混ぜ込まれるランダムデータであり、同一の入力から異なるハッシュを生成させ、事前計算による攻撃を失敗させます。
saltはパスワードのハッシュ化を安全にする小さなランダム性です。これがなければ、同じパスワードを持つ2人のユーザーは同じハッシュになり、攻撃者は事前計算されたテーブルを使ってハッシュを瞬時に逆算できます。パスワードごとに一意のsaltを追加することで、攻撃者はそれぞれを個別に攻撃せざるを得なくなります。saltを理解すると、認証情報がどのように安全に保存されるかが明確になります。
saltが解決する問題
単純なハッシュは決定論的です。同じパスワードは常に同じ値にハッシュ化されます。攻撃者はこれをレインボーテーブル、つまり事前計算されたハッシュからパスワードへのルックアップで悪用します。saltは各ハッシュを一意にするため、こうした事前計算されたテーブルは役に立たなくなります。
saltingの仕組み
- 各パスワードに対してランダムなsaltを生成します。
- saltとパスワードを組み合わせてハッシュ化します。
- 後で検証できるよう、saltをハッシュとともに保存します。
saltは秘密ではない
saltは隠す必要はなく、ハッシュとともに保存されます。その役割は一意性であり、秘匿性ではありません。それが保証するのは、攻撃者がアカウント間で作業を再利用できず、事前計算されたテーブルに頼れないということです。
saltとpepperの違い
pepperはすべてのハッシュに追加される別個の秘密の値で、データベースの外、多くの場合はsecrets storeに保管されます。saltとpepperを併用すれば、データベースを盗んだ攻撃者もpepperを持っていません。この2つは互いを補完します。
CI/CDの文脈におけるsalt
あなたが構築するサービスがユーザーのパスワードを保存するなら、強力なアルゴリズムでsaltとハッシュ化を施す必要があります。pipelineでは、テスト用のfixtureやseedデータに実際の認証情報を決して埋め込むべきではなく、パスワード処理コードはdeployの前に専用のセキュリティレビューに値します。
saltingは必要だが十分ではない
saltは事前計算を防ぎますが、高速なハッシュでは依然として攻撃者が素早く推測できます。総当たり攻撃を非現実的にするには、saltingをbcryptのような意図的に低速なパスワードハッシュ関数と組み合わせる必要があります。
重要なポイント
- saltは各ハッシュを個別のものにするためにハッシュ化の前に追加される一意のランダムデータです。
- レインボーテーブルを打ち破り、攻撃者がアカウント間で作業を再利用するのを防ぎます。
- saltがパスワードを完全に保護するには、bcryptのような低速なハッシュ関数が必要です。