変数のランダムな文字列をソルトとして使用する理由は、攻撃者がハッシュでレインボー テーブルを使用する前にすべてのソルトを検索するように強制するためだと思いました。これには長い時間がかかります。
しかし、ほとんどの開発者はソルトに固定サイズを使用しているようです。ほとんどのパスワードがソルトと一緒に保存されているため、1 つのソルトのサイズを調べると、すべてのパスワード ダイジェストからソルトの長さを切り取って、レインボー テーブルを使用することはできませんか?
これがどのように大変な労力になるのかわかりません。なぜ変数ソルトを使用する必要があるのか疑問に思います。攻撃者が必要とする唯一の情報は1 つのソルトのサイズであり、それ以上のソルトを調べる必要がないためです。ランダム化されたサイズははるかに安全ではないでしょうか?
可変性とランダム化は、私には「あいまいさによるセキュリティ」のように思えます。なぜなら、方法を知っていれば回避するのはとても簡単であり、それを実装する唯一の理由は、混乱の瞬間を引き起こすことだからです。それとも私が間違っていますか?
1 に答える
ソルトの長さは任意です。適切なソルトの唯一の要件は、ソルトに対してレインボー テーブル攻撃を実行不可能にするのはこのプロパティであるため、「十分にユニーク」であることです。特定のソルトに対してのみ機能するレインボー テーブルを生成するには、ブルートフォース攻撃を試みるだけです1。
公開ソルトを使用すると、パスワードのリストをクラックするのに時間がかかります。ただし、単一のパスワードをクラックする場合、辞書攻撃が難しくなるわけではありません。-ソルト (暗号化) .
適切なソルトを生成する簡単な方法は、暗号乱数ジェネレーターから大きな値 (たとえば、128 ランダム ビット) を生成することです。これにより、ソルトが同じ長さになることが簡単に保証されますが、128ビットで表現できる一意の値は非常に多くあります。
ハッシュは元の「長い」ソルトを使用して生成されるため、後でトリムされたソルトを使用すると、元のパスワードを指定するときに無効なハッシュが生成されるだけであり、ハッシュの衝突を簡単に見つけることはできません。(bcrypt のような「遅い」ハッシュを選択することは、ハッシュ化されたパスワードを適切に設計するためのもう 1 つの要件です。)
攻撃者がシステムをだまして、狭い範囲のソルト値 (または固定のソルト値でさえも) を使用させることができた場合、ソルトは「十分に一意」のプロパティを失います。
1悲しいことに、多くの人が貧弱なパスワードを選択しています。主に短すぎるパスワード、一般的な単語やシーケンスに基づくパスワード、またはサイト間で共有されているパスワードです。遅いハッシュはかなり役立ち、salt はレインボー テーブルの適用を防ぎますが、アカウントのプールが十分に大きい (そして予想されるよりも短い時間) とすれば、ブルート フォースは依然としていくつかのパスワードを回復する可能性があります。