パスワードのハッシュ化で必ず出てくる「ソルト」。料理の塩のように、ハッシュにひとさじ足すことで安全性が大きく変わります。仕組みと勘所を解説します(攻撃手順は載せません)。
なぜ「味付け」が効くのか
ソルトなしだと、同じパスワードの人は保存されるハッシュも同じになります。これが攻撃者に2つの近道を与えます——事前計算した対応表(レインボーテーブル)が刺さること、そして「1人分の解析結果が、同じパスワードの全員に流用できる」ことです。
ソルトを足すと、同じ "password123" でも保存値が利用者ごとにまったく別物になります。
同じ理屈で、ソルトは利用者ごと(できればパスワードごと)に新しく作る必要があります。全員で同じソルトを使い回すと、同じパスワードの人どうしの保存値がまた一致してしまい、せっかくの効果が薄れます。生成には、推測されにくい暗号学的な乱数を使い、作ったソルトはハッシュ値と一緒に保存します(秘密にする必要はありません)。
なお、ソルトが守るのは「事前計算した表」と「使い回しの一括解析」までです。1つのパスワードを総当たりで狙う攻撃そのものを遅くするのはソルトの仕事ではなく、bcrypt/Argon2 のようなわざと遅いハッシュが担います。両者は守備範囲が違うので、必ずセットで使います。
よくある誤解と正解
誤解
- ソルトは秘密にしないといけない
- 全ユーザー共通のソルトでいい
- ソルトを足せば弱いパスワードでも安全
正解
- ソルトは公開前提でOK(ハッシュと一緒に保存)
- 利用者ごと(できればパスワードごと)に別の乱数
- ソルトは“事前計算と使い回し解析”対策。総当たり対策は低速ハッシュが担う
当サイトの視点:ソルトとペッパーは別物
ソルトと混同されがちなのがペッパー(pepper)です。ペッパーは全体に足す秘密の値で、DBとは別の場所(アプリの設定や鍵管理)に置きます。ソルト(公開・ユーザーごと)とペッパー(秘密・全体共通)は役割が違うので、どちらかがもう一方の代わりにはなりません。とはいえ実務では、まず bcrypt/Argon2 によるソルト+低速ハッシュを正しく使うことが先決です。
次に読む
- 用語:パスワードのハッシュ化とは(ソルトと対で理解する)
- 対策:パスワードの安全な保存方法(ハッシュ化+ソルト実践)
- 入門:パスワードの正しい保管
よくある質問
Qソルトは秘密にしないといけませんか?
いいえ。ソルトは『秘密の鍵』ではなく、ハッシュ値と一緒に保存して構いません。目的は秘匿ではなく、同じパスワードでも保存値を全員バラバラにして、事前計算(レインボーテーブル)や使い回しの一括解析を無効にすることです。秘密にすべきなのは別物の『ペッパー』(後述)です。
Q全ユーザーで同じソルトを使い回してもいいですか?
ダメです。ソルトは利用者ごと(できればパスワードごと)に異なるランダム値であることが肝心です。共通ソルトだと、同じパスワードの人どうしの保存値が一致してしまい、攻撃者は1回の総当たりで複数アカウントをまとめて破れます。新規生成のたびに暗号学的乱数で作ります。
Q自分でソルトを実装する必要がありますか?
ふつうは不要です。bcrypt・Argon2・scrypt といった専用ハッシュは、ソルトの生成と保存(多くはハッシュ文字列の中に同梱)を自動で行います。自前でソルトを足すより、これら標準実装に任せるのが安全で確実です。