この問題に対処するより良い方法は、カスタム関数を使用する代わりに、このコスト強度が組み込まれたハッシュ アルゴリズムを使用することです。結果のハッシュが真にランダムでない場合、これはセキュリティ上の問題である可能性があります。
しかし、それはあなたの質問に答えていないので、私は今それをしようとします.
費用原単位
アルゴリズムが正しく適用された場合、よりコストのかかるアルゴリズムは、攻撃者がデータベースからすべてのパスワードをクラックすることをよりコストのかかるものにします。ただし、誤って適用すると、このコスト強度のほとんどを回避できます。これが、自分で何かを作成しようとするのではなく、コストがかかるように設計されたアルゴリズムを使用することをお勧めする理由です.
塩類
データベース全体のソルトは、ソルトのないレインボー テーブルからのみ保護します。攻撃者がパスワードを使用してデータベースを取得し、salt を知っている場合、salt を使用して独自のレインボー テーブルを作成し、このレインボー テーブルを使用してデータベース内のすべてのパスワードをクラックできます。同じパスワードを持つユーザーは、データベース内で同じハッシュを持ちます。
アカウントごとのソルト (アカウントごとに異なるソルト)、攻撃者は各パスワードを個別にクラックする必要があります。同じパスワードを持つユーザーは、データベース内で異なるハッシュを持ちます。パスワードのクラッキングは、今でははるかにコストがかかります。
反復
再適用する際に注意すべきことは、攻撃者がこの反復の一部のルックアップ テーブルを作成できないようにすることです。言い換えれば、繰り返しには、ユーザーごとに異なるものを含める必要があります。さらに良いことに、ユーザーに対して試行されるパスワードごとに異なるものを含める必要があります。アルゴリズムでパスワードを再利用するため、これは問題ありません。*
ただし、アルゴリズムを少し変更すると、攻撃者は反復の大部分を回避できる可能性があります。次のコードでは、攻撃者は、ハッシュを sha1 を適用した 99.999 のハッシュに変換するルックアップ テーブルを作成できます。実際、このようなテーブルは、すべてのハッシュに 1 回だけ適用し、そのルックアップ テーブルを複数回使用することで作成できます。すべてのパスワードに sha1 を 100.000 回適用する必要がある代わりに、ルックアップ テーブルを作成し、パスワードごとに sha1 を正確に 1 回適用し、パスワードごとに 1 回ルックアップ テーブルでハッシュを検索するだけで済むようになりました。ユーザーごとのソルトを使用しても、ルックアップ テーブルに違いはありません。
ユーザーごとのソルトを使用して行を//here
に変更するsha1($hash . $salt)
場合、攻撃者はデータベース内の一意のソルトごとにそのようなテーブルを作成する必要があります。これは少し手間がかかりますが、攻撃者が試行するすべてのパスワードのすべてのハッシュを計算する必要がある場合に比べれば、はるかに少ない作業です。
<?php
#Bad code below
$iterations = 100000;
$pass = 'hyugf67rf76dt564d5r76';
$salt = '6t6755636459679guytfugiuhbguiygfytcdtresr5tdt5yfuybiugbuyfr56d45esertdcftyuuguy';
$hash = sha1($hash . $pass . $salt);
for ($i=0; $i<$iterations;$i++) {
$hash = sha1($hash); //Here
}
echo $salt . $hash;
?>
* 私は決してセキュリティの専門家ではありません。私はアルゴリズムについてある程度の知識とセキュリティについてある程度の知識を持つ学生ですが、問題が見られないという事実は、問題がないという意味ではありません。