最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中的隨機性 你覺得自己幸運嗎?

 更新時間:2016年01月22日 10:41:31   投稿:lijiao  
PHP中的隨機性,你覺得自己幸運嗎?

本文分析了生成用于加密的隨機數(shù)的相關(guān)問題。 PHP 5沒有提供一種簡單的機制來生成密碼學上強壯的隨機數(shù),但是PHP 7通過引入幾個CSPRNG函數(shù)來解決了這個問題。

一、什么是CSPRNG

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

CSPRNG可能主要用于:

  • 密鑰生成(例如,生成復雜的密鑰)
  • 為新用戶產(chǎn)生隨機的密碼
  • 加密系統(tǒng)

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

二、PHP7 中的CSPRNG

PHP 7引入了兩個新函數(shù)可以用來實現(xiàn)CSPRNG: random_bytes 和 random_int。

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

例子:

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

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

例子:

var_dump(random_int(1, 100));
//possible output: 27

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

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

  • 在window上,CryptGenRandom()總是被使用。
  • 在其他平臺,arc4random_buf()如果可用會被使用(在BSD系列或者具有l(wèi)ibbsd的系統(tǒng)上成立)
  • 以上都不成立的話,一個linux系統(tǒng)調(diào)用getrandom(2)會被使用。
  • 如果還不行,/dev/urandom 會被作為最后一個可使用的工具
  • 如果以上都不行,系統(tǒng)會拋出錯誤

四、一個簡單的測試

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

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

0 個6 = 57.9 次
1 個6 = 34.7次
2 個6 = 6.9次
3 個6 = 0.5次
以下是是實現(xiàn)實現(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 和簡單的 rand 函數(shù)可能得到如下結(jié)果

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

結(jié)果圖如下:

(接近0的值更好)

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

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

PHP5 呢

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

如果你想要開始使用一個更好的隨機數(shù)發(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()

這個庫的一個簡單應(yīng)用用來產(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)該使用一個密碼學上安全的偽隨機數(shù)生成器,random_compat 庫提供了一種好的實現(xiàn)。

如果你想要使用可靠的隨機數(shù)據(jù)源,如你在本文所見,建議盡快使用 random_int 和 random_bytes。

以上就是關(guān)于php隨機性的相關(guān)內(nèi)容,希望對大家的學習有所幫助。

相關(guān)文章

  • php存儲過程調(diào)用實例代碼

    php存儲過程調(diào)用實例代碼

    php存儲過程調(diào)用舉例,供大家學習參考
    2013-02-02
  • PHP 觀察者模式深入理解與應(yīng)用分析

    PHP 觀察者模式深入理解與應(yīng)用分析

    這篇文章主要介紹了PHP 觀察者模式,結(jié)合實例形式深入分析了對觀察者模式的理解與應(yīng)用及相關(guān)注意事項,需要的朋友可以參考下
    2019-09-09
  • PHP行為型模式之責任鏈模式

    PHP行為型模式之責任鏈模式

    責任鏈模式,其目的是組織一個對象鏈處理一個如方法調(diào)用的請求。當ConcreteHandler(具體的處理程序)不知道如何滿足來自Client的請求時,或它的目的不是這個時,它會委派給鏈中的下一個Handler(處理程序)來處理
    2023-04-04
  • 詳解php魔術(shù)方法(Magic methods)的使用方法

    詳解php魔術(shù)方法(Magic methods)的使用方法

    有些東西如果不是經(jīng)常使用,很容易忘記,比如魔術(shù)方法和魔術(shù)常量,這篇文章主要介紹了php魔術(shù)方法(Magic methods)的使用方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 詳解PHP調(diào)用Go服務(wù)的正確方式

    詳解PHP調(diào)用Go服務(wù)的正確方式

    本文主要介紹了PHP調(diào)用Go服務(wù)的正確方式 - Unix Domain Sockets,對進程間通信感興趣的同學,可以參考一下。
    2021-05-05
  • php中unable to fork報錯簡單解決方法

    php中unable to fork報錯簡單解決方法

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于php中unable to fork報錯簡單解決方法,對此有興趣的朋友們可以跟著學習下。
    2021-02-02
  • php實現(xiàn)的CSS更新類實例

    php實現(xiàn)的CSS更新類實例

    這篇文章主要介紹了php實現(xiàn)的CSS更新類及其用法實例,包括了針對模板文件的檢查、更新與替換模板文件等功能,非常實用,需要的朋友可以參考下
    2014-09-09
  • php生成短網(wǎng)址/短鏈接原理和用法實例分析

    php生成短網(wǎng)址/短鏈接原理和用法實例分析

    這篇文章主要介紹了php生成短網(wǎng)址/短鏈接原理和用法,結(jié)合實例形式分析了php生成短網(wǎng)址/短鏈接的基本原理、實現(xiàn)方法與相關(guān)注意事項,需要的朋友可以參考下
    2020-05-05
  • ThinkPHP 防止表單重復提交的方法

    ThinkPHP 防止表單重復提交的方法

    防止表單重復提交有很多種方法,其不外乎,客戶端腳本防止刷新,服務(wù)端token驗證等等,thinkphp內(nèi)置了表單token驗證,可以方便的防止表單重復提交
    2011-08-08
  • php中使用preg_replace函數(shù)匹配圖片并加上鏈接的方法

    php中使用preg_replace函數(shù)匹配圖片并加上鏈接的方法

    preg_replace 執(zhí)行正則表達式的搜索和替換,如果只是單純的匹配字符串建議使用str_replace(),因為其執(zhí)行效率高的多
    2013-02-02

最新評論

武冈市| 曲沃县| 醴陵市| 仁怀市| 远安县| 香河县| 织金县| 内乡县| 都昌县| 连南| 苍南县| 安顺市| 息烽县| 甘洛县| 定远县| 梓潼县| 苍山县| 荥经县| 绵阳市| 湘阴县| 淮滨县| 墨江| 乌什县| 肃宁县| 驻马店市| 绵阳市| 马关县| 德州市| 大名县| 永和县| 贡觉县| 沙洋县| 洞口县| 桦甸市| 洪泽县| 淮安市| 长宁区| 建湖县| 合江县| 靖远县| 新竹市|