《PHP應用:PHP中的隨機性 你覺得自己幸運嗎?》要點:
本文介紹了PHP應用:PHP中的隨機性 你覺得自己幸運嗎?,希望對您有用。如果有疑問,可以聯系我們。
本文分析了生成用于加密的隨機數的相關問題. PHP 5沒有提供一種簡單的機制來生成暗碼學上強壯的隨機數,但是PHP 7通過引入幾個CSPRNG函數來解決了這個問題.PHP學習
PHP學習
一、什么是CSPRNGPHP學習
引用維基百科,一個密碼學上平安的偽隨機數發生器(Cryptographically Secure Pseudorandom Number Generator 縮寫CSPRNG)是一個偽隨機數生成器(PRNG),其生成的偽隨機數適用于密碼學算法.PHP學習
CSPRNG可能主要用于:PHP學習
獲得高級別平安性的一個關鍵方面就是高品質的隨機性PHP學習
二、PHP7 中的CSPRNGPHP學習
PHP 7引入了兩個新函數可以用來實現CSPRNG: random_bytes 和 random_int.PHP學習
random_bytes 函數返回一個字符串,接受一個int型入參代表返回結果的字節數.PHP學習
例子:PHP學習
$bytes = random_bytes('10'); var_dump(bin2hex($bytes)); //possible ouput: string(20) "7dfab0af960d359388e6"
random_int 函數返回一個指定范圍內的int型數字.PHP學習
例子:PHP學習
var_dump(random_int(1, 100)); //possible output: 27
三、后臺運行環境PHP學習
以上函數的隨機性不同的取決于環境:PHP學習
四、一個簡單的測試PHP學習
一個好的隨機數生成系統保證合適的產生“質量”.為了檢查這個質量, 通常要執行一連串的統計測試.不需要深入研究復雜的統計主題,比較一個已知的行為和數字生成器的結果可以贊助質量評價.PHP學習
一個簡單的測試是骰子游戲.假設擲1個骰子1次得到結果為6的概率是1/6,那么如果我同時擲3個骰子100次,得到的結果粗略如下:PHP學習
0 個6 = 57.9 次
1 個6 = 34.7次
2 個6 = 6.9次
3 個6 = 0.5次
以下是是實現實現擲骰子1,000,000次的代碼:PHP學習
$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 函數可能得到如下結果PHP學習
PHP學習
如果先看到rand 和 random_int 更好的比較我們可以應用一個公式把結果畫在圖上.公式是:(php結果-期待的結果)/期待結果的0.5次方.PHP學習
結果圖如下:PHP學習
PHP學習
(接近0的值更好)PHP學習
盡管3個6的結果表現不好,并且這個測試對實際應用來說太過簡單我們仍可以看出 random_int 表現優于 rand.PHP學習
進一步,我們的應用的平安級別由于不可預測性和隨機數發生器的可重復行為而得到提升.PHP學習
PHP5 呢PHP學習
缺省情況下,PHP5 不提供強壯的隨機數發生器.實際上,還是有選擇的比如 openssl_random_pseudo_bytes(), mcrypt_create_iv() 或者直接使用fread()函數來使用 /dev/random 或 /dev/urandom 設備.也有一些包比如 RandomLib 或 libsodium.PHP學習
如果你想要開始使用一個更好的隨機數發生器并且同時準備好使用PHP7,你可以使用Paragon Initiative Enterprises random_compat 庫. random_compat 庫允許你在 PHP 5.x project.使用 random_bytes() and random_int()PHP學習
這個庫可以通過Composer安裝:PHP學習
composer require paragonie/random_compat require 'vendor/autoload.php'; $string = random_bytes(32); var_dump(bin2hex($string)); // string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f" $int = random_int(0,255); var_dump($int); // int(81)
random_compat 庫和PHP7使用不同的順序:PHP學習
fread() /dev/urandom if available mcrypt_create_iv($bytes, MCRYPT_CREATE_IV) COM('CAPICOM.Utilities.1')->GetRandom() openssl_random_pseudo_bytes()
這個庫的一個簡單應用用來產生暗碼:PHP學習
$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
總結PHP學習
你總是應該使用一個密碼學上平安的偽隨機數生成器,random_compat 庫提供了一種好的實現.PHP學習
如果你想要使用可靠的隨機數據源,如你在本文所見,建議盡快使用 random_int 和 random_bytes.PHP學習
以上就是關于php隨機性的相關內容,希望對大家的學習有所贊助.PHP學習
維易PHP培訓學院每天發布《PHP應用:PHP中的隨機性 你覺得自己幸運嗎?》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7650.html