PHP怎么使用加密偽隨機(jī)數(shù)生成器

這篇文章主要介紹了PHP怎么使用加密偽隨機(jī)數(shù)生成器,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供龍井網(wǎng)站建設(shè)、龍井做網(wǎng)站、龍井網(wǎng)站設(shè)計(jì)、龍井網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、龍井企業(yè)網(wǎng)站模板建站服務(wù),10余年龍井做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

今天我們來(lái)介紹的是 PHP 中的加密偽隨機(jī)數(shù)生成器(CSPRNG 擴(kuò)展)。隨機(jī)數(shù)的生成其實(shí)非常簡(jiǎn)單,使用 rand() 或者 mt_rand() 函數(shù)就可以了,但是我們今天說(shuō)的這個(gè)則是使用了更復(fù)雜算法的一套隨機(jī)數(shù)生成器。rand() 已經(jīng)不是很推薦使用了,mt_rand() 的生成速度更快一些,也是現(xiàn)在的主流函數(shù),而加密的偽隨機(jī)數(shù)生成函數(shù)則是密碼安全的,速度會(huì)比 mt_rand() 略慢一點(diǎn)。它需要依賴操作系統(tǒng)的一些函數(shù),這個(gè)我們后面再說(shuō)。

這個(gè)加密擴(kuò)展已經(jīng)集成在 PHP7 中,不需要特別的安裝,如果是 PHP7 以下的版本需要獨(dú)立安裝擴(kuò)展。如果在測(cè)試時(shí)找不到下面介紹的函數(shù),請(qǐng)檢查當(dāng)前 PHP 的版本。

偽隨機(jī)字符生成

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

random_bytes() 每次調(diào)用都會(huì)生成不同內(nèi)容的二進(jìn)制字符串,而參數(shù)則是二進(jìn)制的字節(jié)長(zhǎng)度。直接獲取到的二進(jìn)制數(shù)據(jù)是亂碼格式的,所以一般我們會(huì)需要使用 bin2hex() 來(lái)將二進(jìn)制轉(zhuǎn)換成我們可以看懂的十六進(jìn)制格式字符串。不過(guò)由此帶來(lái)的結(jié)果就是我們轉(zhuǎn)換之后的十六進(jìn)制的字符長(zhǎng)度是我們?cè)O(shè)定的字符長(zhǎng)度的 2 倍。這個(gè)函數(shù)的作用,可以為我們生成安全的用戶密碼 salt 、 密鑰關(guān)鍵字 或者 初始化向量。

random_bytes() 每次調(diào)用都會(huì)生成不同內(nèi)容的字符串,而參數(shù)則是字符長(zhǎng)度的隨機(jī)字符,在這里我們傳遞的是 5 ,返回了 10 個(gè)字符,可以看出這個(gè)參數(shù)是字符數(shù)量,而返回的其實(shí)是字節(jié)數(shù)量,對(duì)應(yīng)一個(gè)字符占用兩個(gè)字節(jié)的返回形式。或者我們就直接記住它返回的就是參數(shù)的兩倍即可。至于這個(gè)函數(shù)的作用嘛,可以為我們生成安全的用戶密碼 salt 、 密鑰關(guān)鍵字 或者 初始化向量。

偽隨機(jī)整數(shù)生成

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

對(duì)于整數(shù)數(shù)字的生成就更簡(jiǎn)單了,為 random_int() 函數(shù)提供兩個(gè)參數(shù),也就是隨機(jī)整數(shù)的范圍就可以了。其實(shí)和 mt_rand() 的用法一樣。

生成來(lái)源

上述兩種加密偽隨機(jī)函數(shù)的生成來(lái)源都是依賴于操作系統(tǒng)的,具體如下:

  • 在 Windows 系統(tǒng),會(huì)使用 CryptGenRandom() 函數(shù)。從7.2.0開(kāi)始使用CNG-API

  • 在 Linux 系統(tǒng),會(huì)使用 Linux getrandom(2) 系統(tǒng)調(diào)用

  • 在其他系統(tǒng),會(huì)使用 /dev/urandom

  • 否則將拋出異常

異常情況

這兩個(gè)函數(shù)也有相應(yīng)的異常情況會(huì)出現(xiàn),比如上面找不到生成來(lái)源的話就會(huì)拋出異常,當(dāng)然,除了這個(gè)之外還會(huì)有其它的因素也會(huì)導(dǎo)致異常的發(fā)生。

  • 如果找不到適當(dāng)?shù)碾S機(jī)性來(lái)源,將拋出異常

  • 如果給定的參數(shù)無(wú)效,將引發(fā) TypeError

  • 如果給定的字節(jié)長(zhǎng)度無(wú)效,將引發(fā)錯(cuò)誤

總結(jié)

今天的內(nèi)容非常簡(jiǎn)單,而且還發(fā)現(xiàn)了 random_bytes() 這個(gè)函數(shù)的秒用,以后不用再自己去寫隨機(jī)生成 salt 的函數(shù)了,就像我們之間介紹密碼加鹽文章中 什么叫給密碼“加鹽”?如何安全的為你的用戶密碼“加鹽”? 的那個(gè)隨機(jī)字符生成函數(shù)(generateSalt)基本就可以用這個(gè)來(lái)替代了。是不是感覺(jué)收獲滿滿呢,學(xué)習(xí)的腳步從未停下,讓我們繼續(xù)一起探索更好玩的內(nèi)容吧??!

測(cè)試代碼:

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

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“PHP怎么使用加密偽隨機(jī)數(shù)生成器”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

當(dāng)前題目:PHP怎么使用加密偽隨機(jī)數(shù)生成器
文章路徑:http://muchs.cn/article0/ghsgio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)網(wǎng)站設(shè)計(jì)、ChatGPT、虛擬主機(jī)品牌網(wǎng)站制作、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化