成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
你總是應該使用一個密碼學上安全的偽隨機數生成器,random_compat 庫提供了一種好的實現。如果你想要使用可靠的隨機數據源,如你在本文所見,建議盡快使用 random_int 和 random_bytes.

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

[[162239]]

什么是CSPRNG

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

CSPRNG可能主要用于:

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

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

  • 加密系統

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

PHP7 中的CSPRNG

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

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

例子:

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

random_int 函數返回一個指定范圍內的int型數字。

例子:

  1. var_dump(random_int(1100)); 
  2. //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次的代碼:

  1. $times = 1000000
  2. $result = []; 
  3. for ($i=0; $i<$times; $i++){ 
  4.     $dieRoll = array(6 => 0); //initializes just the six counting to zero 
  5.     $dieRoll[roll()] += 1//first die 
  6.     $dieRoll[roll()] += 1//second die 
  7.     $dieRoll[roll()] += 1//third die 
  8.     $result[$dieRoll[6]] += 1//counts the sixes 
  9. function roll(){ 
  10.     return random_int(1,6); 
  11. 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次方。

結果圖如下:

test random graph

(接近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() and random_int()

這個庫可以通過Composer安裝:

 

  1. composer require paragonie/random_compat 
  2.  
  3. require 'vendor/autoload.php'
  4. $string = random_bytes(32); 
  5. var_dump(bin2hex($string)); 
  6. // string(64) "8757a27ce421b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2aaec6f" 
  7. $int = random_int(0,255); 
  8. var_dump($int); 
  9. // int(81) 

random_compat 庫和PHP7使用不同的順序:

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

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

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

  1. $passwordChar = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  2. $passwordLength = 8
  3. $max = strlen($passwordChar) - 1
  4. $password = ''
  5. for ($i = 0; $i < $passwordLength; ++$i) { 
  6.     $password .= $passwordChar[random_int(0, $max)]; 
  7. echo $password; 
  8. //possible output: 7rgG8GHu 

總結

你總是應該使用一個密碼學上安全的偽隨機數生成器,random_compat 庫提供了一種好的實現。

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

譯文鏈接:http://www.codeceo.com/article/php-random.html
英文原文:Randomness in PHP – Do You Feel Lucky?

 

責任編輯:王雪燕 來源: 碼農網
相關推薦

2023-12-13 10:46:27

2021-12-27 09:31:20

HashtableJava隨機數

2025-04-21 01:19:59

2020-10-26 13:12:00

多線程調度隨機性

2021-08-31 10:52:30

容量背包物品

2022-10-09 09:38:10

高可用設計

2020-10-22 15:44:07

科技機會技術

2021-09-17 08:04:28

Hooks函數組件架構

2021-01-04 14:21:21

人工智能機器學習語言

2020-08-24 07:18:28

手機監聽Facebook

2013-02-27 16:27:37

2021-01-29 08:09:32

Service接口表現層

2025-02-04 09:35:11

PHP開發者JSON

2022-12-08 19:20:11

開源用戶使用軟件

2020-11-05 07:58:12

CSS變量Web

2024-11-01 15:51:06

2023-11-06 12:57:03

2021-07-05 12:50:55

CRJava代碼

2017-07-25 16:06:32

白熊視頻程序員人工智能

2025-05-07 08:30:00

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国外成人在线视频网站 | 国产精品96久久久久久 | 91精品国产91久久久久久不卞 | 久久久久久久久99 | 亚洲精品电影网在线观看 | 91爱爱·com| 日韩精品一区二区三区中文在线 | 成在线人视频免费视频 | 成人黄色电影在线观看 | 精品一区二区久久 | 国产免费福利在线 | 91社区视频 | 国产伦精品一区二区三区视频金莲 | 久久鲁视频| 日韩精品视频一区二区三区 | 国产一区二区在线免费观看 | 视频在线一区二区 | 激情婷婷| 国产午夜精品理论片a大结局 | 欧美伦理一区 | 大香网伊人 | 日韩中出 | 欧美亚洲视频在线观看 | 中文字幕第十一页 | 一二三四在线视频观看社区 | caoporn国产精品免费公开 | 拍拍无遮挡人做人爱视频免费观看 | 亚洲国产午夜 | 综合色久| 久久精品国产亚洲a | 成人在线精品 | 第四色播日韩第一页 | 午夜精品久久久久久不卡欧美一级 | 99色综合| 户外露出一区二区三区 | 99久久精品免费 | 国产一区www | 欧美日韩在线一区二区 | 免费观看a级毛片在线播放 黄网站免费入口 | 国产日韩精品一区 | 久久精品中文 |