ニュースや技術記事で「パスワードはソルトを付加してハッシュ化して保存する」といった説明を見かけたことはありませんか。
聞いたことはあっても、具体的に何をする仕組みなのか、ハッシュ化とどう違うのか、はっきり説明できない人も多いでしょう。
一言でいえば、ソルトとは、パスワードなどのデータをハッシュ化する前に加える、ランダムな文字列のことです。
この記事では、ソルトの意味や仕組み、ハッシュ化・レインボーテーブル攻撃との違いについてわかりやすく解説します。
ソルトとは
IT業界でパスワードのセキュリティについて調べていると、「ソルト」という言葉を目にすることがあります。
料理の塩と同じ字を使うため、最初は何のことか分かりにくいと感じる人も多いでしょう。
ソルトとは、パスワードなどのデータをハッシュ化する前に加える、ランダムな文字列のことです。
同じパスワードでも、ソルトを加えることで異なるハッシュ値になり、パスワードの推測や解析を難しくします。
ソルトの由来・名前の意味
ソルトという名前は、英語で「塩」を意味するsaltに由来します。
料理で素材に塩を振って味を変えるように、パスワードという素材にランダムな文字列を加えて、元とは異なる見た目に変化させる、というイメージから名付けられたと考えられます。
同じ材料(パスワード)でも、振る塩(ソルト)が違えば、できあがる料理(ハッシュ値)の見た目が変わる、と考えると分かりやすいでしょう。
ソルトの仕組み
ソルトは、パスワードをハッシュ化する前の段階で使われます。
まず、システムはユーザーごとに異なるランダムな文字列、つまりソルトを生成します。
次に、入力されたパスワードにこのソルトを組み合わせたうえで、ハッシュ関数によって変換します。
生成されたハッシュ値と、使用したソルトの値は、どちらもデータベースに保存されます。
ログイン時には、保存されたソルトを使って同じ手順でハッシュ値を計算し、データベースの値と一致するかどうかを確認します。
ソルトを使う目的・効果
ソルトを使う最大の目的は、パスワードの解析を難しくすることです。
- 同じパスワードでも利用者ごとに異なるハッシュ値になる
- あらかじめ計算された対応表を使った攻撃を無効化できる
- 複数のユーザーが同じパスワードを使っていても見分けられなくなる
このように、ソルトは一つの対策で複数のリスクを同時に減らせる、効率のよい仕組みといえます。
ソルトとハッシュ化の違い
ソルトとハッシュ化は、セットで使われることが多いため混同されやすい言葉です。
ハッシュ化とは、元のデータを一定の規則に従って変換し、元に戻せない文字列(ハッシュ値)に変える処理そのものを指します。
一方、ソルトは、そのハッシュ化を行う前にデータへ加える、ランダムな文字列のことです。
| 項目 | ハッシュ化 | ソルト |
|---|---|---|
| 役割 | データを変換する処理 | 変換前に加える値 |
| 目的 | 元データを復元できない形にする | 同じデータでも結果を変える |
| 単体で使えるか | 使える | ハッシュ化と組み合わせて使う |
つまり、ハッシュ化は変換の仕組みそのもの、ソルトはその仕組みを強化するための材料、という関係になります。
ソルトとレインボーテーブル攻撃の違い
レインボーテーブル攻撃とは、よく使われるパスワードとそのハッシュ値をあらかじめ大量に計算して表にまとめ、流出したハッシュ値から元のパスワードを逆引きする攻撃手法です。
ソルトを使っていない場合、同じパスワードは常に同じハッシュ値になるため、この対応表が有効に機能してしまいます。
ソルトを加えると、利用者ごとにハッシュ値が変わるため、あらかじめ用意した対応表では対応できなくなります。
つまり、レインボーテーブル攻撃は脅威となる攻撃手法の名称であり、ソルトはその攻撃を防ぐための対策、という違いがあります。
ソルトの種類・長さ
ソルトに厳密な規格はありませんが、十分な長さのランダムな文字列を使うことが望ましいとされています。
短すぎるソルトや、推測しやすいパターンのソルトは、対策としての効果が弱くなってしまいます。
また、ソルトはユーザーごとに異なる値を生成することが前提であり、全ユーザーで共通のソルトを使うと、効果が大きく下がってしまいます。
実務では、安全性が確認された乱数生成の仕組みを使って、ソルトを作ることが一般的です。
ソルトの使い方
実際の開発現場では、ソルトを一から自分で設計することは少なくなっています。
現在は、bcrypt・scrypt・Argon2といった、パスワード専用のハッシュアルゴリズムを使う方法が広く推奨されています。
これらのアルゴリズムは、ソルトの生成や付加、保存までを内部で自動的に処理してくれます。
さらに、計算に時間をかける仕組みを持っているため、総当たり攻撃への耐性も高められています。
そのため、開発者がソルトの仕組みを理解しつつ、実装自体は信頼できるアルゴリズムに任せる、という使い方が一般的です。
ソルトを使った例文
ソルトは主に、システム開発やセキュリティに関する会話・文書で使われる言葉です。
- ユーザーのパスワードは、ソルトを付加したうえでハッシュ化してからデータベースに保存している
- このシステムはソルトを使っていないため、同じパスワードのユーザーが一目で分かってしまう
- bcryptはソルトの生成と付加を自動で行ってくれるため、実装の手間が少ない
- 過去に流出したハッシュ値は、ソルトが使われていなかったことで解析されてしまった
ソルトに関するよくある誤解
ソルトについては、いくつかの誤解が見られます。
一つ目は、ソルトを使えばパスワードの安全性が完全に保証される、という誤解です。
ソルトは、事前に計算された対応表を使う攻撃を防ぐものであり、それ単体でパスワードを無条件に安全にする仕組みではありません。
二つ目は、ソルトを秘密にしておく必要がある、という誤解です。
ソルトはハッシュ値と一緒にデータベースへ保存されるのが一般的で、ソルト自体を隠すことよりも、ランダム性と十分な長さを確保することが重視されます。
ソルトを使う際の注意点
ソルトを使うときは、いくつかの点に注意が必要です。
- ユーザーごとに異なるランダムなソルトを生成すること
- 推測されやすいパターンや、短すぎる文字列を使わないこと
- ソルトの生成や付加を、信頼できるライブラリやアルゴリズムに任せること
- ソルトだけに頼らず、パスワードの桁数や複雑さなど、他の対策も組み合わせること
これらを意識することで、ソルトの効果を十分に発揮させることができます。
まとめ
ソルトとは、パスワードなどのデータをハッシュ化する前に加える、ランダムな文字列のことです。
同じパスワードでも異なるハッシュ値を生成できるため、レインボーテーブル攻撃や、同一パスワードの一致を防ぐ効果があります。
ハッシュ化は変換の仕組みそのものを指し、ソルトはその仕組みを強化する材料という違いがあります。
実務では、ソルトの生成や管理を自動で行ってくれる、bcryptなどのパスワード専用アルゴリズムを使うことが推奨されています。


コメント