日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
PHP中的隨機性——你覺得自己幸運嗎?

本文分析了生成用于加密的隨機數(shù)的相關(guān)問題。 PHP 5沒有提供一種簡單的機制來生成密碼學上強壯的隨機數(shù),但是PHP 7通過引入幾個CSPRNG函數(shù)來解決了這個問題。

為開原等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及開原網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為做網(wǎng)站、網(wǎng)站設(shè)計、開原網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!

什么是CSPRNG

引用維基百科,一個密碼學上安全的偽隨機數(shù)發(fā)生器(Cryptographically Secure Pseudorandom Number Generator 縮寫CSPRNG)是一個偽隨機數(shù)生成器(PRNG),其生成的偽隨機數(shù)適用于密碼學算法。

CSPRNG可能主要用于:

  • 密鑰生成(例如,生成復(fù)雜的密鑰)

  • 為新用戶產(chǎn)生隨機的密碼

  • 加密系統(tǒng)

獲得高級別安全性的一個關(guān)鍵方面就是高品質(zhì)的隨機性

PHP7 中的CSPRNG

PHP 7引入了兩個新函數(shù)可以用來實現(xiàn)CSPRNG: random_bytes 和 random_int。

random_bytes 函數(shù)返回一個字符串,接受一個int型入?yún)⒋矸祷亟Y(jié)果的字節(jié)數(shù)。

例子:

 
 
  1. $bytes = random_bytes('10'); 
  2. var_dump(bin2hex($bytes)); 
  3. //possible ouput: string(20) "7dfab0af960d359388e6" 

random_int 函數(shù)返回一個指定范圍內(nèi)的int型數(shù)字。

例子:

 
 
  1. var_dump(random_int(1, 100)); 
  2. //possible output: 27 

后臺運行環(huán)境

以上函數(shù)的隨機性不同的取決于環(huán)境:

  • 在window上,CryptGenRandom()總是被使用。

  • 在其他平臺,arc4random_buf()如果可用會被使用(在BSD系列或者具有l(wèi)ibbsd的系統(tǒng)上成立)

  • 以上都不成立的話,一個linux系統(tǒng)調(diào)用getrandom(2)會被使用。

  • 如果還不行,/dev/urandom 會被作為最后一個可使用的工具

  • 如果以上都不行,系統(tǒng)會拋出錯誤

一個簡單的測試

一個好的隨機數(shù)生成系統(tǒng)保證合適的產(chǎn)生“質(zhì)量”。為了檢查這個質(zhì)量, 通常要執(zhí)行一連串的統(tǒng)計測試。不需要深入研究復(fù)雜的統(tǒng)計主題,比較一個已知的行為和數(shù)字生成器的結(jié)果可以幫助質(zhì)量評價。

一個簡單的測試是骰子游戲。假設(shè)擲1個骰子1次得到結(jié)果為6的概率是1/6,那么如果我同時擲3個骰子100次,得到的結(jié)果粗略如下:

  • 0 個6 = 57.9 次

  • 1 個6 = 34.7次

  • 2 個6 = 6.9次

  • 3 個6 = 0.5次

以下是是實現(xiàn)實現(xiàn)擲骰子1,000,000次的代碼:

 
 
  1. $times = 1000000; 
  2. $result = []; 
  3. for ($i=0; $i<$times; $i++){ 
  4.     $dieRoll = array(6 => 0); //initializes just the six counting to zero 
  5.     $dieRoll[roll()] += 1; //first die 
  6.     $dieRoll[roll()] += 1; //second die 
  7.     $dieRoll[roll()] += 1; //third die 
  8.     $result[$dieRoll[6]] += 1; //counts the sixes 
  9. function roll(){ 
  10.     return random_int(1,6); 
  11. var_dump($result); 

用PHP7 的 random_int 和簡單的 rand 函數(shù)可能得到如下結(jié)果

Sixes

expected

random_int

0

579000

579430

1

347000

346927

2

69000

68985

3

5000

4658

如果先看到rand 和 random_int 更好的比較我們可以應(yīng)用一個公式把結(jié)果畫在圖上。公式是:(php結(jié)果-期待的結(jié)果)/期待結(jié)果的0.5次方。

結(jié)果圖如下:

(接近0的值更好)

盡管3個6的結(jié)果表現(xiàn)不好,并且這個測試對實際應(yīng)用來說太過簡單我們?nèi)钥梢钥闯?nbsp;random_int 表現(xiàn)優(yōu)于 rand.

進一步,我們的應(yīng)用的安全級別由于不可預(yù)測性和隨機數(shù)發(fā)生器的可重復(fù)行為而得到提升。

PHP5 呢

缺省情況下,PHP5 不提供強壯的隨機數(shù)發(fā)生器。實際上,還是有選擇的比如 openssl_random_pseudo_bytes(), mcrypt_create_iv() 或者直接使用fread()函數(shù)來使用 /dev/random 或 /dev/urandom 設(shè)備。也有一些包比如 RandomLib 或 libsodium.

如果你想要開始使用一個更好的隨機數(shù)發(fā)生器并且同時準備好使用PHP7,你可以使用Paragon Initiative Enterprises random_compat 庫。 random_compat 庫允許你在 PHP 5.x project.使用 random_bytes() and random_int()

這個庫可以通過Composer安裝:

 
 
  1. composer require paragonie/random_compat 
  2.  
  3. require 'vendor/autoload.php'; 
  4. $string = random_bytes(32); 
  5. var_dump(bin2hex($string)); 
  6. // string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f" 
  7. $int = random_int(0,255); 
  8. var_dump($int); 
  9. // int(81) 

random_compat 庫和PHP7使用不同的順序:

 
 
  1. fread() /dev/urandom if available 
  2. mcrypt_create_iv($bytes, MCRYPT_CREATE_IV) 
  3. COM('CAPICOM.Utilities.1')->GetRandom() 
  4. openssl_random_pseudo_bytes() 

想知道為什么是這個順序建議閱讀 documentation.

這個庫的一個簡單應(yīng)用用來產(chǎn)生密碼:

 
 
  1. $passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
  2. $passwordLength = 8; 
  3. $max = strlen($passwordChar) - 1; 
  4. $password = ''; 
  5. for ($i = 0; $i < $passwordLength; ++$i) { 
  6.     $password .= $passwordChar[random_int(0, $max)]; 
  7. echo $password; 
  8. //possible output: 7rgG8GHu 

總結(jié)

你總是應(yīng)該使用一個密碼學上安全的偽隨機數(shù)生成器,random_compat 庫提供了一種好的實現(xiàn)。

如果你想要使用可靠的隨機數(shù)據(jù)源,如你在本文所見,建議盡快使用 random_int 和 random_bytes.

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


名稱欄目:PHP中的隨機性——你覺得自己幸運嗎?
鏈接地址:http://www.dlmjj.cn/article/djoejoh.html