1

PHP sha1() はハッシュの長いリストと比較することで非常に簡単に壊れる可能性があるため、これはより良いことでしょうか (基本的には、sha1() を何度も適用して、ハッシュ プロセスを遅くすることでブルート フォースを非現実的にしようとします)。 :

<?php
    $iterations = 100000;
    $pass       = 'hyugf67rf76dt564d5r76';
    $salt       = '6t6755636459679guytfugiuhbguiygfytcdtresr5tdt5yfuybiugbuyfr56d45esertdcftyuuguy';
    $hash       = '';

    for ($i=0; $i<$iterations;$i++) {
        $hash = sha1($hash . $pass . $salt);
    }

    echo $salt . $hash;
?>
4

2 に答える 2

2

何度も何度も適用する代わりに、より強力なソルトで一度sha1実装してみませんか?crypt()

PHP 5.5 + を使用している場合は、単純にpassword_hash()

password_hash() のユーザーランド実装もここで入手できます

ヒント:password_hash()上記のドキュメント リンクの例 #4 と #3 を組み合わせて、より強力なハッシュを作成できます。


またはphpassを使用する

phpass でサポートされている推奨される(最も安全な) ハッシュ方法は、OpenBSD スタイルの Blowfish ベースの bcrypt です。これは、パブリック ドメインの crypt_blowfish パッケージ (C アプリケーション用) でもサポートされており、PHP では CRYPT_BLOWFISH として知られ、 BSDI スタイルへのフォールバックが拡張されています。 PHP では CRYPT_EXT_DES として知られる DES ベースのハッシュ、および phpass 自体に実装されている MD5 ベースのソルトおよび可変反復カウント パスワード ハッシュ (ポータブル ハッシュとも呼ばれます) への最後の手段としてのフォールバック。

于 2014-04-19T13:15:28.013 に答える
1

この問題に対処するより良い方法は、カスタム関数を使用する代わりに、このコスト強度が組み込まれたハッシュ アルゴリズムを使用することです。結果のハッシュが真にランダムでない場合、これはセキュリティ上の問題である可能性があります。

しかし、それはあなたの質問に答えていないので、私は今それをしようとします.

費用原単位

アルゴリズムが正しく適用された場合、よりコストのかかるアルゴリズムは、攻撃者がデータベースからすべてのパスワードをクラックすることをよりコストのかかるものにします。ただし、誤って適用すると、このコスト強度のほとんどを回避できます。これが、自分で何かを作成しようとするのではなく、コストがかかるように設計されたアルゴリズムを使用することをお勧めする理由です.

塩類

データベース全体のソルトは、ソルトのないレインボー テーブルからのみ保護します。攻撃者がパスワードを使用してデータベースを取得し、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;
?>

* 私は決してセキュリティの専門家ではありません。私はアルゴリズムについてある程度の知識とセキュリティについてある程度の知識を持つ学生ですが、問題が見られないという事実は、問題がないという意味ではありません。

于 2014-04-19T14:21:04.047 に答える