溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解PHP中的隨機性函數

發(fā)布時間:2021-09-29 14:14:02 來源:億速云 閱讀:121 作者:iii 欄目:開發(fā)技術

本篇內容介紹了“如何理解PHP中的隨機性函數”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

如何理解PHP中的隨機性函數

一、什么是CSPRNG

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

CSPRNG可能主要用于:

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

  • 為新用戶產生隨機的密碼

  • 加密系統(tǒng)

獲得高級別安全性的一個關鍵方面就是高品質的隨機性

二、PHP7 中的CSPRNG

PHP 7引入了兩個新函數可以用來實現CSPRNG: random_bytes 和 random_int。

random_bytes 函數返回一個字符串,接受一個int型入參代表返回結果的字節(jié)數。

例子:

$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

三、后臺運行環(huán)境

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

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

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

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

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

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


四、一個簡單的測試

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

一個簡單的測試是骰子游戲。假設擲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 函數可能得到如下結果

如何理解PHP中的隨機性函數

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

結果圖如下:

如何理解PHP中的隨機性函數

(接近0的值更好)

盡管3個6的結果表現不好,并且這個測試對實際應用來說太過簡單我們仍可以看出 random_int 表現優(yōu)于 rand.

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

PHP5 呢

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

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

這個庫可以通過Composer安裝:

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使用不同的順序:

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

這個庫的一個簡單應用用來產生密碼:

$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中的隨機性函數”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI