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

資訊專欄INFORMATION COLUMN

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

鄒強(qiáng) / 3476人閱讀

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

本文分析了生成用于加密的隨機(jī)數(shù)的相關(guān)問(wèn)題。 PHP 5沒(méi)有提供一種簡(jiǎn)單的機(jī)制來(lái)生成密碼學(xué)上強(qiáng)壯的隨機(jī)數(shù),但是PHP 7通過(guò)引入幾個(gè)CSPRNG函數(shù)來(lái)解決了這個(gè)問(wèn)題。

什么是CSPRNG

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

CSPRNG可能主要用于:

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

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

加密系統(tǒng)

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

PHP7 中的CSPRNG

PHP 7引入了兩個(gè)新函數(shù)可以用來(lái)實(shí)現(xiàn)CSPRNG: random_bytesrandom_int

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

例子:

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

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

例子:

var_dump(random_int(1, 100));
//possible output: 27
后臺(tái)運(yùn)行環(huán)境

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

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

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

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

如果還不行,/dev/urandom 會(huì)被作為最后一個(gè)可使用的工具

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

一個(gè)簡(jiǎn)單的測(cè)試

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

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

0 個(gè)6 = 57.9 次

1 個(gè)6 = 34.7次

2 個(gè)6 = 6.9次

3 個(gè)6 = 0.5次

以下是是實(shí)現(xiàn)實(shí)現(xiàn)擲骰子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 和簡(jiǎn)單的 rand 函數(shù)可能得到如下結(jié)果

Sixes    expected    random_int
0        579000      579430
1        347000      346927
2        69000       68985
3        5000        4658

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

結(jié)果圖如下:

                  (接近0的值更好)

盡管3個(gè)6的結(jié)果表現(xiàn)不好,并且這個(gè)測(cè)試對(duì)實(shí)際應(yīng)用來(lái)說(shuō)太過(guò)簡(jiǎn)單我們?nèi)钥梢钥闯?random_int 表現(xiàn)優(yōu)于 rand.

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

PHP5 呢

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

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

這個(gè)庫(kù)可以通過(guò)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 庫(kù)和PHP7使用不同的順序:

fread() /dev/urandom if available

mcrypt_create_iv($bytes, MCRYPT_CREATE_IV)

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

openssl_random_pseudo_bytes()

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

這個(gè)庫(kù)的一個(gè)簡(jiǎn)單應(yīng)用用來(lái)產(chǎn)生密碼:

$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)該使用一個(gè)密碼學(xué)上安全的偽隨機(jī)數(shù)生成器,random_compat 庫(kù)提供了一種好的實(shí)現(xiàn)。

如果你想要使用可靠的隨機(jī)數(shù)據(jù)源,如你在本文所見(jiàn),建議盡快使用 random_intrandom_bytes.

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

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

相關(guān)文章

  • PHP中的機(jī)性——覺(jué)得自己幸運(yùn)?

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

    Eric 評(píng)論0 收藏0
  • 深度學(xué)習(xí)與神經(jīng)科學(xué)相遇(三)[]

    摘要:例如,是一些神經(jīng)元的特征,其中突觸權(quán)重變化的符號(hào)取決于突觸前后的較精確至毫秒量級(jí)相對(duì)定時(shí)。,是大腦自身調(diào)整其神經(jīng)元之間的連接強(qiáng)度的生物過(guò)程。從他博士期間就開(kāi)始研究至今,目前可以說(shuō)深度學(xué)習(xí)占領(lǐng)著機(jī)器學(xué)習(xí)的半壁江山,而則是深度學(xué)習(xí)的核心。 上次說(shuō)到誤差梯度的反向傳播(Backpropagation),這次咱們從這繼續(xù)。需要說(shuō)明的是,原文太長(zhǎng),有的地方會(huì)有些冗長(zhǎng)啰嗦,所以后面的我會(huì)選擇性地進(jìn)行翻譯...

    _ipo 評(píng)論0 收藏0
  • [] 深入理解 Promise 五部曲:2. 控制權(quán)轉(zhuǎn)換問(wèn)題

    摘要:直到最近,我們?nèi)匀辉谟煤?jiǎn)單的回調(diào)函數(shù)來(lái)處理異步的問(wèn)題。當(dāng)我們只有一個(gè)異步任務(wù)的時(shí)候使用回調(diào)函數(shù)看起來(lái)還不會(huì)有什么問(wèn)題。 原文地址:http://blog.getify.com/promis... 廈門旅行歸來(lái),繼續(xù)理解Promise 在上一篇深入理解Promise五部曲:1.異步問(wèn)題中,我們揭示了JS的異步事件輪詢并發(fā)模型并且解釋了多任務(wù)是如何相互穿插使得它們看起來(lái)像是同時(shí)運(yùn)行的。...

    alanoddsoff 評(píng)論0 收藏0
  • 在OpenSUSE上編安裝sphinx擴(kuò)展

    摘要:準(zhǔn)備工作要在中安裝擴(kuò)展,你必須先安裝好,筆者使用的是中文分詞,因此我安裝的是。配置修改文件,將添加到擴(kuò)展選項(xiàng)部分。錯(cuò)誤解決在安裝的過(guò)程中,遇到一個(gè)比較二的錯(cuò)誤。總結(jié)在下,很多時(shí)候安裝和搜索依賴庫(kù)的目錄是不一致的,應(yīng)當(dāng)仔細(xì)檢查。 準(zhǔn)備工作 要在PHP中安裝sphinx擴(kuò)展,你必須先安裝好sphinx,筆者使用的是中文分詞,因此我安裝的是coreseek。 如何安裝coreseek請(qǐng)看:h...

    xiongzenghui 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<