暗号理論における
ソルトとは、
パスワードやパスフレーズなどのデータをハッシュ化する際に、一方向性関数の入力に加えるランダムなデータのことです。
ソルトは、
パスワードをストレージに保存する際の保護に利用され、セキュリティを高めるために不可欠な要素となっています。
ソルトの歴史と必要性
初期のシステムでは、
パスワードが
平文のまま保存されていたため、セキュリティ上の大きな問題がありました。その後、
パスワードに対する攻撃から保護するための対策が開発され、
ソルトはその一つとして登場しました。
ソルトは
パスワードごとにランダムに生成され、
平文の
パスワード(またはキーストレッチを施した後の
パスワード)と結合された上で、
暗号学的ハッシュ関数に入力されます。そして、その出力(ハッシュ値)が
ソルトとともにデータベースへ保存されます。このプロセスにより、
パスワードをハッシュ化することで
平文の
パスワードを保存する必要がなくなり、認証情報が漏洩した場合でも
平文の
パスワードが漏れるリスクを低減できます。
ソルトを使用することで、
辞書攻撃や
レインボーテーブル攻撃への対策が可能です。
ソルトの値は人間が記憶する必要がないため、ユーザーの負担を増やすことなく、攻撃に必要な
レインボーテーブルのサイズを実質的に無限大にすることができます。また、
ソルトは毎回異なる値が使われるため、たとえ同じ
パスワードを複数のサイトで使い回していたとしても、
ソルトを加えたハッシュ値はそれぞれ異なるものになります。
以下に、
ソルトを使用して
パスワードを保存する手順の例を示します。
ユーザー名 | パスワード | ソルト (ランダム生成) | ハッシュ値 (ソルトとパスワードをハッシュ化) |
---|
- | - | - | - |
user1 | passwordA | salt1 | hash(salt1 + passwordA) |
user2 | passwordB | salt2 | hash(salt2 + passwordB) |
user3 | passwordA | salt3 | hash(salt3 + passwordA) |
このように、
ソルトの値が異なることで、たとえ
平文の
パスワードが同じでも、生成されるハッシュ値は全く別のものになります。これにより、攻撃者がハッシュ値を事前に計算しておくことが難しくなり、
辞書攻撃の効果を大きく低下させることができます。
パスワードをハッシュ化する際に、毎回同じ
ソルトを使用するケースは非常に危険です。
ソルトが固定されていると、そこから抽出した
ソルトを使って新しい
レインボーテーブルを生成されてしまう可能性があります。また、同じ
パスワードを使用しているユーザーは、ハッシュ値が同じになってしまうため、攻撃者は一つのハッシュ値を使って複数のユーザーを攻撃することが容易になります。
ソルトが短すぎると、
ソルトが取りうる値すべてと、よくある
パスワードすべての組み合わせに対する
レインボーテーブルを、攻撃者が容易に作成できてしまいます。
ソルトは十分に長いものを使用することが重要です。
ソルトは、単一の
パスワードに対する攻撃だけでなく、複数の
パスワードに対する攻撃に対する防御力も高めます。
ソルトがない場合、攻撃者は推測した
パスワードをハッシュ化し、その結果と一致するハッシュ値をファイル内から探すだけで済みます。しかし、
ソルトがある場合、攻撃者はファイル内の各エントリごとに、
ソルト付きのハッシュ値を計算し比較する必要があります。この処理は、
ソルトなしの場合と比較して、非常に時間がかかります。
ソルトは、ハッシュテーブルや
レインボーテーブルを使った
パスワードクラッキングを防止するのにも有効です。
ソルトがない
パスワードは、攻撃者がハッシュテーブルに保存されたハッシュ値と照合することで、容易にクラッキングされる可能性があります。しかし、
ソルト付きの
パスワードの場合、
レインボーテーブルには「
ソルト +
パスワード」をハッシュ化した値が必要となり、
ソルトが十分に長ければ、そのような値が見つかる可能性は非常に低くなります。
また、人間が選んだ
パスワードは、短く、
辞書攻撃に弱い傾向がありますが、
ソルトは人間が記憶する必要がないため、長く複雑な値を使用できます。これにより、ユーザーに負担をかけることなく、攻撃者が
パスワードを解読するのを困難にすることが可能です。
実装における考慮事項
シャドウ
パスワードを備えた現代的なシステムでは、
パスワードのハッシュ値やセキュリティに関するデータは、非公開のファイルに格納されるため、セキュリティリスクは軽減されています。しかし、中央集約型の
パスワード管理システムを使用している環境では、
パスワードやハッシュ値が複数のシステムに送信されるため、
ソルトの生成方法を含めたアルゴリズムの適切性が重要になります。
ソルトは、大量の
パスワードに対する攻撃速度を低下させる効果もあります。
ソルトがない場合、攻撃者は一度ハッシュ化した結果を使い回すことができますが、
ソルトがある場合は、各
パスワードごとにハッシュ化する必要があるため、処理速度が大きく低下します。また、同じ
パスワードを使用しているユーザーが複数いる場合でも、
ソルトが異なれば、ハッシュ値は異なるため、アカウントの安全性を高める効果も期待できます。
Unixにおける実装
初期のUnixでは、
パスワードファイルに
ソルト付きの
パスワードが保存されていました。初期の
ソルトは2文字のランダムなデータで、
パスワードの最大長は8文字に制限されていました。その後、シャドウ
パスワードが導入され、
ソルトの長さが8文字、
パスワードの最大長は無制限となりました。
Webアプリケーションにおける実装
Webアプリケーションでは、ユーザの
パスワードはハッシュ化されてデータベースに保存されます。
ソルトを使用しない場合、SQLインジェクションが成功すると、
パスワードが容易に解読される可能性があります。
ソルトは、Webアプリケーション全体のセキュリティを高めるために非常に重要です。
まとめ
ソルトは、
パスワードを安全に保管するために不可欠な技術です。適切な
ソルトを使用することで、
パスワードのセキュリティを大幅に向上させることが可能です。
ソルトの正しい理解と使用は、あらゆるシステムやアプリケーションにおいて、セキュリティを維持するための重要な要素となります。
関連項目
- - パスワードクラック
- - ノンス
- - 初期化ベクトル
- - パディング (暗号)
- - Hasty Pudding cipher
- - レインボーテーブル
- - ペッパー (暗号)
参考文献
- - Wille, Christoph (2004年1月5日). "Storing Passwords - done right!". 2019年2月14日閲覧。
- - OWASP Cryptographic Cheat Sheet
- - how to encrypt user passwords