首頁  >  文章  >  後端開發  >  PHP如何使用加密偽隨機數產生器

PHP如何使用加密偽隨機數產生器

醉折花枝作酒筹
醉折花枝作酒筹轉載
2021-05-27 17:46:211872瀏覽

這篇文章跟大家介紹一下PHP使用加密偽隨機數產生器的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

PHP如何使用加密偽隨機數產生器

#今天我們來介紹的是PHP 中的加密偽隨機數產生器(CSPRNG 擴充) 。隨機數的產生其實非常簡單,使用 rand() 或 mt_rand() 函數就可以了,但是我們今天說的這個則是使用了更複雜演算法的一套隨機數產生器。 rand() 已經不是很建議使用了,mt_rand() 的產生速度更快一些,也是現在的主流函數,而加密的偽隨機數產生函數則是密碼安全的,速度會比 mt_rand() 略慢一點。它需要依賴作業系統的一些函數,這個我們後面再說。

這個加密擴充功能已經整合在 PHP7 中,不需要特別的安裝,如果是 PHP7 以下的版本需要獨立安裝擴充功能。如果在測試時找不到下面介紹的函數,請檢查目前 PHP 的版本。

偽隨機字元產生

var_dump(bin2hex(random_bytes(5)));
// string(10) "f28dc2bdd5"
var_dump(random_bytes(5));
// string(5) "�"��"

random_bytes() 每次呼叫都會產生不同內容的二進位字串,而參數則是二進位的位元組長度。直接取得到的二進位資料是亂碼格式的,所以一般我們會需要使用 bin2hex() 來將二進位轉換成我們可以看懂的十六進位格式字串。不過由此帶來的結果就是我們轉換之後的十六進位的字元長度是我們設定的字元長度的 2 倍。這個函數的作用,可以為我們產生安全的使用者密碼 salt 、 金鑰關鍵字 或 初始化向量。

random_bytes() 每次呼叫都會產生不同內容的字串,而參數則是字符長度的隨機字符,在這裡我們傳遞的是5 ,返回了10 個字符,可以看出這個參數是字元數量,而回傳的其實是位元組數量,對應一個字元佔用兩個位元組的回傳形式。或者我們就直接記住它回傳的就是參數的兩倍即可。至於這個函數的作用嘛,可以為我們產生安全的使用者密碼 salt 、 金鑰關鍵字 或 初始化向量。

偽隨機整數產生

var_dump(random_int(100, 999));
var_dump(random_int(-1000, 0));
// int(900)
// int(-791)

對於整數數字的產生就更簡單了,為 random_int() 函數提供兩個參數,也就是隨機整數的範圍就可以了。其實和 mt_rand() 的用法一樣。

產生來源

上述兩種加密偽隨機函數的產生來源都是依賴作業系統的,具體如下:

  • 在Windows 系統,會使用CryptGenRandom() 函數。從7.2.0開始使用CNG-API

  • 在Linux 系統,會使用Linux getrandom(2) 系統呼叫

  • 在其他系統,會使用/dev/urandom

  • 否則將拋出異常

異常情況

這兩個函數也有對應的異常情況會出現,例如上面找不到生成來源的話就會拋出異常,當然,除了這個之外還會有其它的因素也會導致異常的發生。

  • 如果找不到適當的隨機性來源,將拋出例外

  • 如果給定的參數無效,將引發TypeError

  • 如果給定的位元組長度無效,將引發錯誤

#總結

#今天的內容非常簡單,而且也發現了random_bytes() 這個函數的秒用,以後不用再自己去寫隨機生成salt 的函數了,就像我們之間介紹密碼加鹽文章中什麼叫給密碼「加鹽」?如何安全的為你的用戶密碼「加鹽」?的那個隨機字元產生函數(generateSalt)基本上就可以用這個來取代了。是不是覺得收穫滿滿呢,學習的腳步從未停下,讓我們繼續一起探索更好玩的內容吧! !

測試程式碼:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84%E5%8A%A0%E5%AF%86%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%94%9F%E6%88%90%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8.php

推薦學習:php影片教學

#

以上是PHP如何使用加密偽隨機數產生器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除