2

私はZendFrameworkを使用して求人広告サイトを作成しています(ポートフォリオの目的で、はい、世界には「さらに別のCraigslistクローン」の余地がないことを知っています)。アカウントを必要とせずに投稿/編集/削除する機能を実装しようとしています。

これを行うには、送信後にNonceを生成し、データベースに保存する必要があるように感じます。次に、次のように、削除のGETリクエストを行うユーザーにリンクをメールで送信します。

http://www.somesite.com/post/delete/?id=123&nonce=2JDXS93JFKS8204HJTHSLDH230945HSLDF

ユーザーのみがこの一意のキーまたはナンスを持っています。送信時に、投稿のIDでデータベースをチェックし、削除する前にナンスが一致することを確認します。

私の問題は、ナンスが実際にどれほど安全かということです。Zend Frameworkを使用すると、次のZend_Form_Element_Hashようなハッシュが作成されます。

protected function _generateHash()
{
    $this->_hash = md5(
        mt_rand(1,1000000) 
        .  $this->getSalt() 
        .  $this->getName() 
        .  mt_rand(1,1000000)
    );
    $this->setValue($this->_hash);
}

mt_rand()について読んだあるコメント者は、 「この関数のエントロピーは限られています。したがって、ランダムな文字列を作成する場合、文字列の長さに関係なく、約20億の異なる文字列しか生成しません。これは重大なセキュリティになる可能性があります。このような文字列をセッション識別子、パスワードなどに使用している場合に問題が発生します。

アプリケーションのナンス/トークンの存続期間(ユーザーが投稿の削除を選択するまでに数日または数週間かかる可能性がある)のため、潜在的なハッキングには十分な時間が与えられると思います。

左側と右側のこのビジュアルマッピングピクセルに見られるものmt_rand()からの大幅なアップグレードであることがわかります。しかし、それで十分ですか?「20億の異なる文字列」がセキュリティの問題になる理由は何ですか?rand()randmt_rand

そして最終的に、ナンス/トークン/ハッシュのエントロピーをどのように増やすことができますか?

4

2 に答える 2

1

このようなセキュリティのためには、出力の長さだけが重要ではありません。それはあなたがそれを作成するためにどれだけのランダム性を使用したかを数えます。

ランダム性の原因は、そのmt_rand()シードと状態(シードされてから使用した回数)です。呼び出しが増えるmt_rand()と、同じランダム性ソースのリヘイズが増えます(新しいエントロピーはありません)。

mt_rand()のシードはわずか32ビットです(128ビット未満のものは暗号学者を疑わしくします;)

32ビットのエントロピーを持つキーの強度は、40億を生成するキーの数で割ったものです(たとえば、100Kの使用後、有効なキーを推測する可能性は約1:43000になり、実用的なブルートフォーシングに近づきます。 )。

これにソルトを追加します。これにより、シードの攻撃者はソルトも知っている必要があるため、ソルトが長い場合は、「低い」にもかかわらず、全体的にキーが非常に強力になる可能性があります。エントロピ。

エントロピーを増やすには、 mt_randとは異なるソースからランダムなものを追加する必要があります(少しランダムでもかまいませんが、ビット数が少なくなります)microtime()/dev/random得る。

(編集:uniqid()はエントロピーが弱いため、ここでは役に立ちません)

于 2012-03-20T23:18:10.617 に答える
1

上記のmd5()ハッシュ関数の入力であるZendハッシュ生成コードには、1,000,000X1,000,000の異なる可能性があります。md5()には、入力が何であっても、32 ^ 16(1208925819614629174706176)の可能な結果があります。平均して、ハッカーは正しいナンスを推測するためにサーバーに500,000,000,000のリクエストを送信する必要があります。

1分あたり100リクエストの場合、ハッキングには約3472222日かかります。

于 2012-03-20T23:19:05.523 に答える