成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP 中的隨機(jī)數(shù)——你覺得可靠么?

Anshiii / 2404人閱讀

摘要:本文主要分析以加密為目的的隨機(jī)數(shù)生成問題。一個(gè)簡例一個(gè)好的隨機(jī)數(shù)生成系統(tǒng)能確保生成質(zhì)量適合的隨機(jī)數(shù)。此處,暫不深入討論復(fù)雜的統(tǒng)計(jì)話題,將已知的行為與隨機(jī)數(shù)生成器的結(jié)果進(jìn)行比較,有助于質(zhì)量評估。

本文主要分析以加密為目的的隨機(jī)數(shù)生成問題。PHP 5 并未提供生成強(qiáng)加密隨機(jī)數(shù)的簡便機(jī)制,但是,PHP 7 引入了兩個(gè) CSPRNG 函數(shù)以解決該問題。系 OneAPM 工程師編譯整理。

什么是 CSPRNG?

引用維基百科的定義,密碼安全的虛擬隨機(jī)數(shù)生成器(Cryptographically Secure Pseudorandom Number Generator,CSPRNG)是帶有特定屬性使之在密碼學(xué)中適用的虛擬隨機(jī)數(shù)生成器(pseudo-random number generator,PRNG)。

CSPRNG 主要用于:

生成鍵(比如:生成復(fù)雜的鍵)

為新的用戶賬號生成隨機(jī)密碼

加密系統(tǒng)

保證高安全水準(zhǔn)的一個(gè)重要因素便是高質(zhì)量的隨機(jī)數(shù)。

PHP 7 中的 CSPRNG

PHP 7 為 CSPRNG 引入了兩種新函數(shù):random_bytesrandom_int。

random_bytes 函數(shù)返回 string 類型,并接受一個(gè) int 類型為參數(shù),該參數(shù)規(guī)定了所返回字符串的字節(jié)長度。

例如:

$bytes = random_bytes("10");
var_dump(bin2hex($bytes));
//possible ouput: string(20) "7dfab0af960d359388e6"  

random_int 函數(shù)返回給定范圍內(nèi)的整型數(shù)字。

舉例:

var_dump(random_int(1, 100));
//possible output: 27
幕后解密

以上函數(shù)的隨機(jī)數(shù)來源因環(huán)境不同而有所差異:

在 Windows 系統(tǒng),會使用 CryptGenRandom() 函數(shù)。

在其他平臺,會優(yōu)先使用 arc4random_buf() 函數(shù)(限 BSD 衍生系統(tǒng)或帶 libbsd 的系統(tǒng))。

若以上兩點(diǎn)均不符合,會使用 Linux getrandom(2) 系統(tǒng)調(diào)用。

若以上來源均不符合,會拋出 Error。

一個(gè)簡例

一個(gè)好的隨機(jī)數(shù)生成系統(tǒng)能確保生成質(zhì)量適合的隨機(jī)數(shù)。為了檢驗(yàn)質(zhì)量,需要運(yùn)行一系列的統(tǒng)計(jì)試驗(yàn)。此處,暫不深入討論復(fù)雜的統(tǒng)計(jì)話題,將已知的行為與隨機(jī)數(shù)生成器的結(jié)果進(jìn)行比較,有助于質(zhì)量評估。

一個(gè)簡單的測試方法是擲骰游戲。假設(shè)投擲一次,投出6的概率是1/6。如果同時(shí)投擲三個(gè)骰子,投100次,投得零次、一次、兩次及三次6的次數(shù)大概是:

0 次6 = 57.9 次

1 次6 = 34.7 次

2 次6 = 6.9 次

3 次6 = 0.5 次

以下是骰子投擲100萬次的代碼:

$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);

用 PHP 7 的 random_int 與簡單的 rand 函數(shù)測試上面的代碼,可能會得到:

Sixes expected random_int rand
0 579000 579430 578179
1 347000 346927 347620
2 69000 68985 69586
3 5000 4658 4615

更直觀地查看 randrandom_int 的差別,可以運(yùn)用方程式放大兩組結(jié)果的差異,并繪制成圖表:

php result - expected result / sqrt(expected)

得到的結(jié)果如下:


(結(jié)果越接近零越好)

即便三個(gè)6的組合表現(xiàn)一般,且該測試與真實(shí)應(yīng)用相比太過簡單,我們也能清楚地看到 random_int 的表現(xiàn)優(yōu)于 rand。況且,隨機(jī)數(shù)生成器的可預(yù)見行為、重復(fù)行為越少,應(yīng)用的安全程度就更高。

PHP 5 又如何呢?

默認(rèn)情況下,PHP 5 并未提供任何強(qiáng)虛擬隨機(jī)數(shù)生成器。而實(shí)際使用中,可以使用 openssl_random_pseudo_bytes()、mcrypt_create_iv() 方法,或直接結(jié)合使用 /dev/random/dev/urandomfread() 方法。此外,還有包 RandomLib 或 libsodium。

如果你想用一個(gè)比較好的隨機(jī)數(shù)生成器,同時(shí)能與 PHP 7 兼容,你可以使用 Paragon Initiative 公司的 random_compat 庫。該庫允許在 PHP 5.x 項(xiàng)目中使用 random_bytes()random_int() 方法。

該庫可以使用 Composer 進(jìn)行安裝:

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 庫使用了與 PHP 7 中不同的優(yōu)先序列:

如果可用,先使用 fread() /dev/urandom

mcrypt_create_iv($bytes, MCRYPT_CREATE_IV)

COM("CAPICOM.Utilities.1")->GetRandom()

openssl_random_pseudo_bytes()

想了解為何采用這一優(yōu)先序列,可以閱讀本文檔。

使用該庫生成密碼的簡單案例如下:

$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
總結(jié)

你應(yīng)該盡量使用在密碼學(xué)上安全的虛擬隨機(jī)數(shù)生成器。random_compat 庫為此提供了很好的實(shí)現(xiàn)方法。

如果你想使用可靠的隨機(jī)數(shù)來源,正如前文所述,盡快開始使用 random_intrandom_bytes 吧!

原文地址:http://www.sitepoint.com/randomness-php-feel-lucky/

OneAPM for PHP 能夠深入到所有 PHP 應(yīng)用內(nèi)部完成應(yīng)用性能管理 能夠深入到所有 PHP 應(yīng)用內(nèi)部完成應(yīng)用性能管理和監(jiān)控,包括代碼級別性能問題的可見性、性能瓶頸的快速識別與追溯、真實(shí)用戶體驗(yàn)監(jiān)控、服務(wù)器監(jiān)控和端到端的應(yīng)用性能管理。想閱讀更多技術(shù)文章,請?jiān)L問 OneAPM 官方技術(shù)博客。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21278.html

相關(guān)文章

  • 【譯】PHP中的隨機(jī)性——覺得自己幸運(yùn)嗎?

    摘要:本文分析了生成用于加密的隨機(jī)數(shù)的相關(guān)問題。沒有提供一種簡單的機(jī)制來生成密碼學(xué)上強(qiáng)壯的隨機(jī)數(shù),但是通過引入幾個(gè)函數(shù)來解決了這個(gè)問題。呢缺省情況下,不提供強(qiáng)壯的隨機(jī)數(shù)發(fā)生器。如果你想要使用可靠的隨機(jī)數(shù)據(jù)源,如你在本文所見,建議盡快使用和 本文分析了生成用于加密的隨機(jī)數(shù)的相關(guān)問題。 PHP 5沒有提供一種簡單的機(jī)制來生成密碼學(xué)上強(qiáng)壯的隨機(jī)數(shù),但是PHP 7通過引入幾個(gè)CSPRNG函數(shù)來解決了...

    鄒強(qiáng) 評論0 收藏0
  • 【譯】PHP中的隨機(jī)性——覺得自己幸運(yùn)嗎?

    摘要:本文分析了生成用于加密的隨機(jī)數(shù)的相關(guān)問題。沒有提供一種簡單的機(jī)制來生成密碼學(xué)上強(qiáng)壯的隨機(jī)數(shù),但是通過引入幾個(gè)函數(shù)來解決了這個(gè)問題。呢缺省情況下,不提供強(qiáng)壯的隨機(jī)數(shù)發(fā)生器。如果你想要使用可靠的隨機(jī)數(shù)據(jù)源,如你在本文所見,建議盡快使用和 本文分析了生成用于加密的隨機(jī)數(shù)的相關(guān)問題。 PHP 5沒有提供一種簡單的機(jī)制來生成密碼學(xué)上強(qiáng)壯的隨機(jī)數(shù),但是PHP 7通過引入幾個(gè)CSPRNG函數(shù)來解決了...

    Eric 評論0 收藏0
  • thinkphp整合企業(yè)號的坑

    摘要:使用微信企業(yè)號回調(diào)的坑最近在做企業(yè)號回調(diào)的接口,之前做過幾個(gè)企業(yè)號的應(yīng)用了,每次接入到都報(bào)各種各樣的錯(cuò)誤,算哥倒霉,該踩的不該踩的坑全踩了。 ThinkPHP 使用微信企業(yè)號回調(diào)的坑 最近在做企業(yè)號回調(diào)的接口,之前做過幾個(gè)企業(yè)號的應(yīng)用了,每次接入到Thinkphp都報(bào)各種各樣的錯(cuò)誤,算哥倒霉,該踩的不該踩的坑全踩了。 這次掉坑里差點(diǎn)就放棄了,開發(fā)過企業(yè)號的都知道,企業(yè)號回調(diào)會經(jīng)過一個(gè)...

    wing324 評論0 收藏0
  • 數(shù)據(jù)訓(xùn)練營|BAT都在用的方法,詳解A/B測試的那些坑!

    摘要:我們再來看國內(nèi)一線公司內(nèi)的一個(gè)實(shí)驗(yàn)吧數(shù)據(jù)訓(xùn)練營都在用的方法,詳解測試的那些坑如上是不同的引導(dǎo)卡片樣式的實(shí)驗(yàn),最終結(jié)果樣式比樣式的提升。設(shè)指標(biāo)數(shù)值隱變量列顯變量列含方案變量。 作者|螞蟻金服人工智能部產(chǎn)品經(jīng)理 范磊 本文首發(fā)|微信公眾號 友盟數(shù)據(jù)服務(wù) (ID:umengcom),轉(zhuǎn)載請注明出處 If you are not running experiments,you are prob...

    Gilbertat 評論0 收藏0
  • PHP中static與yield關(guān)鍵字的思考

    摘要:先來說說關(guān)鍵字。什么時(shí)候用來修飾方法關(guān)鍵字大家都知道是用來修飾方法與屬性的。一句話學(xué)會面向?qū)ο蟮姆绞絹硭伎肌3浞职l(fā)揮其性能優(yōu)勢,又能解決擴(kuò)展性差的問題。這里不會進(jìn)行與的比較。 你以為你知道了一切,只是你以為而已。知識的美妙就在于,一生的時(shí)光在它面前顯得多么的短暫。 嗯嗯,扯遠(yuǎn)了,我今天只想說說:static 與 yield。 先來說說 static 關(guān)鍵字。本篇只講靜態(tài)方法的使用與后期...

    thursday 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<