ホームページ >バックエンド開発 >PHPチュートリアル >パスワード リセットなどのアプリケーション用に PHP で乱数を安全に生成するにはどうすればよいですか?

パスワード リセットなどのアプリケーション用に PHP で乱数を安全に生成するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-01 15:53:12299ブラウズ

How Can I Securely Generate Random Numbers in PHP for Applications Like Password Reset?

PHP での安全な乱数生成: 包括的な概要

暗号化では、多くの場合、予測不可能な乱数の生成が必要になります。 PHP では、「mt_rand」関数はこれらの要件を満たしていません。この記事では、PHP 自体で乱数を生成する安全な方法を詳しく掘り下げ、パスワード忘れの問題に対処します。

最初に提案された解決策には、次のようにシードを保存し、呼び出しごとにシードを更新することが含まれます。

result = seed
seed = sha512(seed . mt_rand())

ただし、このアプローチには重大な欠点があります。 sha512 関数は魔法のようにエントロピーを強化するものではなく、「mt_rand」呼び出しは敵対者を阻止するには不十分です。代わりに、最新のオペレーティング システムによって提供されるエントロピー ソースを利用することをお勧めします。

  • Unix プラットフォーム: "/dev/urandom"
  • Windows プラットフォーム: 暗号化 API

安全な 128 ビットのランダムを生成する PHP コード スニペットは次のとおりです。 string:

$pr_bits = '';
if (file_exists("/dev/urandom")) {
    $fp = fopen('/dev/urandom','rb');
    $pr_bits .= fread($fp, 16);
    fclose($fp);
} elseif (class_exists('COM')) {
    try {
        $CAPI_Util = new COM('CAPICOM.Utilities.1');
        $pr_bits .= $CAPI_Util->GetRandom(16, 0);
        if ($pr_bits) { $pr_bits = md5($pr_bits, TRUE); }
    } catch (Exception $ex) {
        // echo 'Exception: ' . $ex->getMessage();
    }
}

if (strlen($pr_bits) < 16) {
    // Inform the administrator of the missing pseudorandom generator
}

移植性を最大限に高めるために、コードに両方のエントロピー ソースの試行を必ず含めてください。この方法は確実ではないかもしれませんが、最初のシードベースのアプローチと比較してセキュリティが大幅に向上します。

以上がパスワード リセットなどのアプリケーション用に PHP で乱数を安全に生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。