[翻訳] PHP のランダム性 - あなたは幸運だと思いますか?

WBOY
リリース: 2016-06-23 13:15:14
オリジナル
867 人が閲覧しました

元のリンク: http://www.sitepoint.com/ocr-in-php-read-text-from-images-with-tesseract/

この記事は MaNong.com で最初に公開されました: http: //www .codeceo.com/article/php-ocr-tesseract-get-text.html

翻訳者: Qiu Kang (Weibo: Qiu Kang singasong)

この記事では、暗号化のための乱数の生成に関連する問題を分析します。 PHP 5 には、暗号的に強力な乱数を生成する単純なメカニズムが提供されていませんでしたが、PHP 7 では、いくつかの CSPRNG 関数を導入することでこの問題を解決しました。

CSPRNGとは

Wikipediaを引用すると、暗号学的に安全な擬似乱数生成器(CSPRNG)は、暗号アルゴリズムに適した擬似乱数を生成する擬似乱数生成器(PRNG)です。

CSPRNG は主に次の用途に使用できます:

  1. 鍵の生成 (例: 複雑な鍵の生成)

  2. 新しいユーザーのランダムなパスワードを生成

  3. 暗号化システム

  4. 高いセキュリティレベルのAキーを取得PHP7 の

CSPRNG の側面

PHP 7 では、CSPRNG の実装に使用できる 2 つの新しい関数、random_bytes と random_int が導入されました。

random_bytes 関数は文字列を返し、返された結果のバイト数を表す int 入力パラメータを受け取ります。

例:

$bytes = random_bytes('10');var_dump(bin2hex($bytes));//possible ouput: string(20) "7dfab0af960d359388e6"
ログイン後にコピー

random_int 関数は、指定された範囲内の int 数値を返します。

例:

var_dump(random_int(1, 100));//possible output: 27
ログイン後にコピー

バックグラウンド実行環境

上記の関数のランダム性は環境によって異なります:

    ウィンドウでは、常に CryptGenRandom() が使用されます。
  • 他のプラットフォームでは、利用可能な場合は arc4random_buf() が使用されます (BSD シリーズまたは libbsd を備えたシステムで確立されています)
  • 上記のいずれにも当てはまらない場合は、Linux システム コール getrandom(2) が使用されます。
  • それでも動作しない場合は、/dev/urandom が利用可能な最後のツールとして使用されます
  • 上記のどれも動作しない場合、システムはエラーをスローします
  • 簡単なテスト

適切な乱数 生成システムにより、適切な生成の「品質」が保証されます。この品質をチェックするために、通常、一連の統計的テストが実行されます。複雑な統計のトピックを深く掘り下げずに、既知の動作を数値生成プログラムの結果と比較することは、品質評価に役立ちます。

簡単なテストはサイコロゲームです。 1 つのサイコロを 1 回振って 6 の目が出る確率が 1/6 であると仮定すると、3 つのサイコロを同時に 100 回振ると、結果はおおよそ次のようになります:

    0 6 = 57.9 回
  • 1 6の数 = 34.7倍
  • 2の6の数 = 6.9倍
  • 3の6の数 = 0.5倍
  • 以下はサイコロ1,0を実装するコードです。 00,000 回:
$times = 1000000;$result = [];for ($i=0; $i<$times; $i++){    $dieRoll = array(6 => 0); //initializes just the six counting to zero    $dieRoll[roll()] += 1; //first die    $dieRoll[roll()] += 1; //second die    $dieRoll[roll()] += 1; //third die    $result[$dieRoll[6]] += 1; //counts the sixes}function roll(){    return random_int(1,6);}var_dump($result);
ログイン後にコピー

PHP7 の使用 Random_intそして単純です rand 関数は次の結果を取得する可能性があります

Sixes    expected    random_int0        579000      5794301        347000      3469272        69000       689853        5000        4658
ログイン後にコピー

より適切に比較するために、最初に rand と random_int を確認すると、数式を適用して結果をグラフに描画できます。式は次のとおりです: (php 結果 - 期待される結果)/期待される結果の 0.5 乗。

結果のグラフは次のとおりです:

                  (接近0的值更好)
ログイン後にコピー

3 6 の結果は良くなく、このテストは実際のアプリケーションには単純すぎますが、それでも、random_int のパフォーマンスが rand より優れていることがわかります。

さらに、アプリケーションのセキュリティレベルは、乱数発生器の予測不可能性と再現性のある動作によって増加します。

PHP5 についてはどうですか?

デフォルトでは、PHP5 は強力な乱数ジェネレーターを提供しません。実際、openssl_random_pseudo_bytes()、mcrypt_create_iv()、または fread() 関数を直接使用して /dev/random または /dev/urandom デバイスを使用するオプションがまだあります。 RandomLib や libsodium などのパッケージもあります

より優れた乱数ジェネレーターの使用を開始し、同時に PHP7 を使用する準備ができている場合は、Paragon Initiative Enterprises のrandom_compat ライブラリを使用できます。 random_compat ライブラリを使用すると、PHP 5 でrandom_bytes() とrandom_int() を使用できるようになります。 ()

openssl_random_pseudo_bytes ()

    これがなぜそうなるのか知りたい場合は、ドキュメントを読むことをお勧めします。
  • パスワードを生成するためのこのライブラリの簡単なアプリケーション:
  • $passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';$passwordLength = 8;$max = strlen($passwordChar) - 1;$password = '';for ($i = 0; $i < $passwordLength; ++$i) {    $password .= $passwordChar[random_int(0, $max)];}echo $password;//possible output: 7rgG8GHu
    ログイン後にコピー

    总结

    你总是应该使用一个密码学上安全的伪随机数生成器, random_compat库提供了一种好的实现。

    如果你想要使用可靠的随机数据源,如你在本文所见,建议尽快使用 random_int和 random_bytes.

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート