本篇文章主要介紹PHP中的CSPRNG函數,感興趣的朋友參考下,希望對大家有所協助。
一、什麼是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模組化安裝詳細步驟教程