簡単な承認を想像してください。 ユーザーは多数のユーザー名/パスワード値を取得します。パスワードハッシュを取得し、このバンドルをデータベースに保存されているデータと比較します。 簡単にするために、MD5とPHPのコード例を使用します。
$password = md5($password);
この場合、ユーザーがqwertyパスワードを持っていると、次のハッシュを取得します: d8578edf8458ce06fbc5bb76a58c5ca4 攻撃者がデータベースにアクセスすると、既製のサービス( http://wordd.org/D8578EDF8458CE06FBC5BB76A58C5CA4 )を利用して、このハッシュを提供する値をすでに持っているか、自分で削除できます。
すでに準備された値を持つハッシュテーブルから保護するには、静的ソルトを使用できます。
$password = md5($password . "MyUniqueSault");
同じqwertyパスワードを使用すると、まったく異なるハッシュbdadb0330124cda0e8499c9cd118f7bdが得られます。 既製のテーブルはもはや攻撃者の助けにはならず、ブルートフォースを使用する必要があります。 静的ソルトのマイナスはここにあります。攻撃者は静的ソルトを使用してハッシュテーブルを生成し、データベースからほとんどのパスワードの値を取得できます。 このマイナスを排除するために、各ハッシュに一意のソルトが使用されます。
$sault = GenerateRandomString(); $password = md5($password . $sault);
つまり ここで、ログイン/パスワードハッシュに加えて、データベースは各ユーザーに対して生成されたソルトの値を保存する必要があります。 例を分析してみましょう。user1とuser2という2人のユーザーがいます。 両方ともqwertyパスワードを使用します。 しかし、最初はzxcv saltが生成され、2番目はasdfが生成されました。 その結果、同じパスワードを持つユーザーは異なるハッシュを持つことになります: 1d8f3272b013387bbebcbedb4758586dとa192862aa3bf46dffb57b12bdcc4c199 。これが何をするか:動的なソルトでハッシュ値を見つけるために、それを再生成する必要があります。 これはすべて、データベースの「ドレイン」が発生した場合に値を選択する時間を増やすことを目的としており、「適切な」ハッシュアルゴリズムを使用すると、少なくとも2、3のパスワードを選択するのにかなりの時間がかかります。 生成されたソルトは単一のユーザーではなく、大量のブルータスからすべてを保護することを理解することが重要です。 それだけです。暗号ハッシュアルゴリズムSHA1、SHA512を使用していることを思い出してください。 上記で使用したMD5は、次のように使用することはお勧めしません。 時代遅れの認識。
Kolonistはコメントhabrahabr.ru/post/145648/#comment_4894759で 十分に要約しました(特別な感謝とプラスをお伝えします)。
もう一度。
1.塩なし-既製のレインボーテーブルを使用します。
2.すべてに1つのソルトがあります。1つのレインボーテーブルを生成し、その上のすべてのユーザーを「ブレイク」します。
3.各ユーザーに個別のソルトがあります-各ユーザーに個別のブルートフォース。