首頁  >  文章  >  後端開發  >  PHP中的CSPRNG函數

PHP中的CSPRNG函數

墨辰丷
墨辰丷原創
2018-06-05 13:54:531832瀏覽

本篇主要介紹PHP中的CSPRNG函數,有興趣的朋友參考下,希望對大家有幫助。

一、什麼是CSPRNG

#引用維基百科,一個密碼學上安全的偽隨機數產生器(Cryptographically Secure Pseudorandom Number Generator 縮寫CSPRNG)是一個偽隨機數產生器(Cryptographically Secure Pseudorandom Number Generator 縮寫CSPRNG)是一個偽隨機數產生器(PRNG),其產生的偽隨機數適用於密碼學演算法。

CSPRNG可能主要用於:

  • 金鑰產生(例如,產生複雜的金鑰)

  • 為新使用者產生隨機的密碼

  • #加密系統

獲得高等級安全性的一個關鍵面向是高品質的隨機性

二、PHP7 中的CSPRNG

PHP 7引入了兩個新函數可以用來實現CSPRNG: 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


#三、背景執行環境

以上函數的隨機性不同的取決於環境:

  • 在window上,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次的代碼:


$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 函數可能會得到以下結果

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

結果圖如下:

(接近0的值更好)

儘管3個6的結果表現不好,並且這個測試對實際應用來說太過簡單我們仍可以看出random_int 表現優於rand.

進一步,我們的應用的安全級別由於不可預測性和隨機數發生器的可重複行為而得到提升。

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。

相關推薦:

PHP原理之執行週期實例分析

PHP原始碼目錄結構與功能說明詳解

PHP模組化安裝詳細步驟教學


#

以上是PHP中的CSPRNG函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn