ソルト(salt)は、パスワードのハッシュ計算に使う、パスワードごとに生成するランダムな値です。同じパスワードでもソルトを変えることで保存するハッシュ値が変わり、事前計算した対応表の使い回しを難しくします。
同じパスワードでも保存値を変える
| 利用者 | パスワード | ソルト | 保存するハッシュ |
|---|---|---|---|
| Aさん | 同じ文字列 | ランダム値A | ハッシュA |
| Bさん | 同じ文字列 | ランダム値B | ハッシュB |
表は仕組みのイメージです。十分な長さのランダムなソルトを個別に使い、特定のハッシュ値が複数利用者に共通して現れにくくします。
ソルトは秘密にする必要がない
ログイン時の照合にも必要なため、通常はハッシュ値と一緒に保存します。入力されたパスワードと保存済みソルトを使って再計算し、保存値と照合します。これは元のパスワードを復号しているのではありません。
レインボーテーブルへの対策と限界
ソルトが異なると、ソルトを考慮しない事前計算表をそのまま流用できません。ただし、保存済みソルトを知る攻撃者が、個々のパスワード候補を計算して照合することまで不可能になるわけではありません。短い・推測されやすいパスワードが安全になる保証もありません。
ソルトを足して高速ハッシュ1回で終わらせない
実際の保存には、Argon2idなどのパスワード保存向け方式と適切なコスト設定を使います。SHA-256などの高速ハッシュにソルトを足して1回計算するだけの方式は、候補の大量照合に弱いため避けます。実装では、ソルトの生成・保存を扱う実績あるライブラリを利用します。
ペッパーとの違い
| 項目 | ソルト | ペッパー |
|---|---|---|
| 値の使い方 | パスワードごとに異なる値 | 複数のパスワードに共通して使う秘密値 |
| 秘密性 | 秘密にする必要はない | 秘密に保つ |
| 保管 | 通常はハッシュ値と同じDB | ハッシュ値を保存するDBとは分離 |
追加の秘密値を使う方法は、ペッパーの記事で詳しく整理しています。
確認問題
ソルトは、パスワードハッシュと一緒に保存してはいけない秘密情報でしょうか?
解答・解説を見る
いいえ。ソルトは通常、ハッシュ値と一緒に保存します。秘密に保ち、DBと分離する必要がある追加の値はペッパーです。
パスワード攻撃と対策をnoteで復習
無料noteには、レインボーテーブル攻撃・ソルト・ハッシュ関数の解説があります。どの攻撃に、どの対策が対応するかをまとめて復習できます。
ほかの分野は資格・目的別のnote教材ナビから選べます。

コメント