摘要:本文分析了生成用于加密的隨機數的相關問題。沒有提供一種簡單的機制來生成密碼學上強壯的隨機數,但是通過引入幾個函數來解決了這個問題。呢缺省情況下,不提供強壯的隨機數發生器。如果你想要使用可靠的隨機數據源,如你在本文所見,建議盡快使用和
本文分析了生成用于加密的隨機數的相關問題。 PHP 5沒有提供一種簡單的機制來生成密碼學上強壯的隨機數,但是PHP 7通過引入幾個CSPRNG函數來解決了這個問題。
什么是CSPRNG引用維基百科,一個密碼學上安全的偽隨機數發生器(Cryptographically Secure Pseudorandom Number Generator 縮寫CSPRNG)是一個偽隨機數生成器(PRNG),其生成的偽隨機數適用于密碼學算法。
CSPRNG可能主要用于:
密鑰生成(例如,生成復雜的密鑰)
為新用戶產生隨機的密碼
加密系統
獲得高級別安全性的一個關鍵方面就是高品質的隨機性
PHP7 中的CSPRNGPHP 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 函數可能得到如下結果
Sixes expected random_int 0 579000 579430 1 347000 346927 2 69000 68985 3 5000 4658
如果先看到rand 和 random_int 更好的比較我們可以應用一個公式把結果畫在圖上。公式是:(php結果-期待的結果)/期待結果的0.5次方。
結果圖如下:
(接近0的值更好)
盡管3個6的結果表現不好,并且這個測試對實際應用來說太過簡單我們仍可以看出 random_int 表現優于 rand.
進一步,我們的應用的安全級別由于不可預測性和隨機數發生器的可重復行為而得到提升。
PHP5 呢缺省情況下,PHP5 不提供強壯的隨機數發生器。實際上,還是有選擇的比如 openssl_random_pseudo_bytes(), mcrypt_create_iv() 或者直接使用fread()函數來使用 /dev/random 或 /dev/urandom 設備。也有一些包比如 RandomLib 或 libsodium.
如果你想要開始使用一個更好的隨機數發生器并且同時準備好使用PHP7,你可以使用Paragon Initiative Enterprises random_compat 庫。 random_compat 庫允許你在 PHP 5.x project.使用 random_bytes() 和 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()
想知道為什么是這個順序建議閱讀 documentation.
這個庫的一個簡單應用用來產生密碼:
$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總結
你總是應該使用一個密碼學上安全的偽隨機數生成器,random_compat 庫提供了一種好的實現。
如果你想要使用可靠的隨機數據源,如你在本文所見,建議盡快使用 random_int 和 random_bytes.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/11169.html
摘要:本文分析了生成用于加密的隨機數的相關問題。沒有提供一種簡單的機制來生成密碼學上強壯的隨機數,但是通過引入幾個函數來解決了這個問題。呢缺省情況下,不提供強壯的隨機數發生器。如果你想要使用可靠的隨機數據源,如你在本文所見,建議盡快使用和 本文分析了生成用于加密的隨機數的相關問題。 PHP 5沒有提供一種簡單的機制來生成密碼學上強壯的隨機數,但是PHP 7通過引入幾個CSPRNG函數來解決了...
摘要:例如,是一些神經元的特征,其中突觸權重變化的符號取決于突觸前后的較精確至毫秒量級相對定時。,是大腦自身調整其神經元之間的連接強度的生物過程。從他博士期間就開始研究至今,目前可以說深度學習占領著機器學習的半壁江山,而則是深度學習的核心。 上次說到誤差梯度的反向傳播(Backpropagation),這次咱們從這繼續。需要說明的是,原文太長,有的地方會有些冗長啰嗦,所以后面的我會選擇性地進行翻譯...
摘要:直到最近,我們仍然在用簡單的回調函數來處理異步的問題。當我們只有一個異步任務的時候使用回調函數看起來還不會有什么問題。 原文地址:http://blog.getify.com/promis... 廈門旅行歸來,繼續理解Promise 在上一篇深入理解Promise五部曲:1.異步問題中,我們揭示了JS的異步事件輪詢并發模型并且解釋了多任務是如何相互穿插使得它們看起來像是同時運行的。...
摘要:準備工作要在中安裝擴展,你必須先安裝好,筆者使用的是中文分詞,因此我安裝的是。配置修改文件,將添加到擴展選項部分。錯誤解決在安裝的過程中,遇到一個比較二的錯誤。總結在下,很多時候安裝和搜索依賴庫的目錄是不一致的,應當仔細檢查。 準備工作 要在PHP中安裝sphinx擴展,你必須先安裝好sphinx,筆者使用的是中文分詞,因此我安裝的是coreseek。 如何安裝coreseek請看:h...
閱讀 1770·2023-04-25 22:42
閱讀 2212·2021-09-22 15:16
閱讀 3491·2021-08-30 09:44
閱讀 490·2019-08-29 16:44
閱讀 3308·2019-08-29 16:20
閱讀 2516·2019-08-29 16:12
閱讀 3390·2019-08-29 16:07
閱讀 670·2019-08-29 15:08