6

PHP では、一部のフレームワークが microtime() 関数を使用して、次のようにパスワード リセット トークンを生成していることに気付きました。

  $token = md5(microtime());

これはセキュリティ上の問題ですか? 攻撃者がクロックをサーバーとある程度正確に同期できる場合、攻撃者はトークンを総当たり攻撃する可能性があります。1 秒の同期に必要な試行回数は 1,000,000 回だけであり、これはたいした問題ではありません。

この攻撃が成功する確率は? 代わりに /dev/urandom または openssl_pseudo_bytes() を使用してトークンを生成する必要がありますか? microtime() は悪い習慣ですか?

4

3 に答える 3

4

はい、セキュリティの問題です!時間をかけてトークンを生成することは、非常に悪い習慣です。 Burp Suiteは、攻撃者が予測可能なトークンをブルート フォースすることを簡単にし、時間に基づくトークンは非常に予測可能です。Burp を使用すると、トークンを簡単に収集し、統計分析を実行してエントロピーを決定できます。この情報を使用すると、将来のトークンを簡単に予測できます。

覚えておいてください、攻撃者はそれを一度だけ正しく取得する必要があります. 何百万回間違えても違いはありません。

以下は、役に立つかもしれないトークン生成に関する便利な (そして最近の) StackOverflow 投稿です: REST Web サービス認証トークンの実装

于 2013-03-20T17:22:10.557 に答える
0

トークンは、マイクロタイムではなく、常にランダムに作成する必要があります。セキュリティを強化するために (もう一度考えてみましょう: コンピュータは計算以外のことはできません)、php の例を参照してください: http://php.net/manual/de/function.srand.php「完全に」ランダムな文字列を簡単に作成するには、http://php.net/manual/de/function.chr.php も参照してください。これが私がそれを行う方法です

mt_srand((double) microtime() * 1000000);
    function random_string ($length = 16)
    {
        $string = "";
        for ($n = 0; $n < count($length); $n++) $string .= chr(rand(32, 126));
        return $string;
    }

于 2013-03-20T15:32:32.000 に答える
0

そうです(と思います)。
ハッカーは 1 ~ 2 時間でパスワードを推測できる可能性があります。(サーバーが制限を使用している場合、ハッカーはボットネットを使用するか、多くの時間と多くの試行を行うことで、それを回避できます。

私があなただったら、静的塩を追加します。ソルトは構成 (または他の安全な場所) からロードする必要があります。ソルトは、サーバー所有者または誰によっても設定されるべきではありません。実際のランダム API によって生成される必要があります (Google が役立つはずですが、random.org が提供していると思います)。
その API を使用できない場合は、ヘッカーがいつサーバーがセットアップされたかを知らない限り (または、サーバー管理者が時々それを削除するかもしれませんが、自動ではありません!)、疑似ソルトも役立ちます。

例:

$salt = null;
include('protectedDir/salt.php'); // Here should stand "$salt = ''"
if ($salt == null){
// Using real random api
file_put_contents('protectedDir/salt.php', '<?php \$salt = \'$salt\'; ?>)";
}

$resetKey = sha1(microtime() . $salt);

// バグが含まれている可能性があります。未テスト。これは単なる例であり、コピーして貼り付けて実装するべきではありません。

ハックが php ファイル ('protectedDir/salt.php') の「ソース コード」にアクセスできる場合、彼はデータベースの構成も表示できるはずです。そして、それはより大きな問題になるでしょう。

于 2013-03-20T15:50:41.253 に答える