目次
PHP のランダム性 - あなたは幸運だと思いますか?
ホームページ バックエンド開発 PHPチュートリアル PHP のランダム性 - あなたは幸運だと思いますか? _PHP チュートリアル

PHP のランダム性 - あなたは幸運だと思いますか? _PHP チュートリアル

Jul 12, 2016 am 09:00 AM
php ランダム性

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

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

Cryptography Randomness in PHP

CSPRNGとは

暗号的に安全な擬似乱数生成器、Wikipediaより引用 Cryptographically Secure Pseudorandom Number Generator (略称 CSPRNG) は、暗号アルゴリズムに適した擬似乱数を生成する擬似乱数生成器 (PRNG) です。

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

  • キーの生成 例: 複雑なキーの生成)

  • 新規ユーザー用にランダムなパスワードを生成します

  • 暗号化システム

高レベルのセキュリティを達成するための重要な側面は、高品質のランダム性です

PHP7 の CSPRNG

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

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

例:

リーリー

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

例:

リーリー

バックエンド動作環境

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

  • ウィンドウでは、常に 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,000,000 回振ることを実装するコードです:

リーリー

PHP7のrandom_intと単純なrand関数を使用すると、次の結果が得られる可能性があります

シックス

期待しています

random_int

0

579000

579430

1

347000

346927

2

69000

68985

3

5000

4658

如果先看到rand 和 random_int 更好的比较我们可以应用一个公式把结果画在图上。公式是:(php结果-期待的结果)/期待结果的0.5次方。

结果图如下:

test random graph

接近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.x project.使用 random_bytes() and random_int()

这个库可以通过Composer安装:

<ol class="dp-j"><li class="alt"><span><span>composer require paragonie/random_compat </span></span></li><li><span> </span></li><li class="alt"><span>require <span class="string">'vendor/autoload.php'</span><span>; </span></span></li><li><span>$string = random_bytes(<span class="number">32</span><span>); </span></span></li><li class="alt"><span>var_dump(bin2hex($string)); </span></li><li><span><span class="comment">// string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f"</span><span> </span></span></li><li class="alt"><span>$<span class="keyword">int</span><span> = random_int(</span><span class="number">0</span><span>,</span><span class="number">255</span><span>); </span></span></li><li><span>var_dump($<span class="keyword">int</span><span>); </span></span></li><li class="alt"><span><span class="comment">// int(81)</span><span> </span></span></li></ol>
ログイン後にコピー

random_compat 库和PHP7使用不同的顺序:

<ol class="dp-j"><li class="alt"><span><span>fread() /dev/urandom </span><span class="keyword">if</span><span> available </span></span></li><li><span>mcrypt_create_iv($bytes, MCRYPT_CREATE_IV) </span></li><li class="alt"><span>COM(<span class="string">'CAPICOM.Utilities.1'</span><span>)->GetRandom() </span></span></li><li><span>openssl_random_pseudo_bytes() </span></li></ol>
ログイン後にコピー

想知道为什么是这个顺序建议阅读 documentation.

这个库的一个简单应用用来产生密码:

<ol class="dp-j"><li class="alt"><span><span>$passwordChar = </span><span class="string">'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'</span><span>; </span></span></li><li><span>$passwordLength = <span class="number">8</span><span>; </span></span></li><li class="alt"><span>$max = strlen($passwordChar) - <span class="number">1</span><span>; </span></span></li><li><span>$password = <span class="string">''</span><span>; </span></span></li><li class="alt"><span><span class="keyword">for</span><span> ($i = </span><span class="number">0</span><span>; $i < $passwordLength; ++$i) { </span></span></li><li><span>    $password .= $passwordChar[random_int(<span class="number">0</span><span>, $max)]; </span></span></li><li class="alt"><span>} </span></li><li><span>echo $password; </span></li><li class="alt"><span><span class="comment">//possible output: 7rgG8GHu</span><span> </span></span></li></ol>
ログイン後にコピー

总结

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

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

译文链接:http://www.codeceo.com/article/php-random.html
英文原文:Randomness in PHP – Do You Feel Lucky?

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1093808.htmlTechArticlePHP中的随机性——你觉得自己幸运吗? 本文分析了生成用于加密的随机数的相关问题。PHP5没有提供一种简单的机制来生成密码学上强壮的...
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles