今天我們來介紹的是 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
參考檔案:
https://www.php.net/manual/zh/book.csprng.php
關注公眾號:【硬核專案經理】獲取最新文章
添加微信/QQ好友:【xiaoyuezigonggong/149844827】免費得PHP、專案管理學習資料
知乎、公眾號、抖音、頭條搜索【硬核專案經理】
B站ID:482780532
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285567.html
標籤:PHP
上一篇:TP6框架--EasyAdmin學習筆記:實作資料庫增刪查改
下一篇:PHP的Hash資訊摘要擴展框架
