本篇文章為大家展示了如何在PHP中使用OpenSSL加密,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、河間網(wǎng)站維護(hù)、網(wǎng)站推廣。
成都做網(wǎng)站、網(wǎng)站制作的開發(fā),更需要了解用戶,從用戶角度來建設(shè)網(wǎng)站,獲得較好的用戶體驗(yàn)。成都創(chuàng)新互聯(lián)多年互聯(lián)網(wǎng)經(jīng)驗(yàn),見的多,溝通容易、能幫助客戶提出的運(yùn)營建議。作為成都一家網(wǎng)絡(luò)公司,打造的就是網(wǎng)站建設(shè)產(chǎn)品直銷的概念。選擇成都創(chuàng)新互聯(lián),不只是建站,我們把建站作為產(chǎn)品,不斷的更新、完善,讓每位來訪用戶感受到浩方產(chǎn)品的價(jià)值服務(wù)。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)撫順縣免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了成百上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的岑溪網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
創(chuàng)新互聯(lián)公司是一家專業(yè)提供潛江企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為潛江眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
河曲網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
PHP的OpenSSL加密擴(kuò)展學(xué)習(xí)(一):對稱加密
我們已經(jīng)學(xué)過不少 PHP 中加密擴(kuò)展相關(guān)的內(nèi)容了。而今天開始,我們要學(xué)習(xí)的則是重點(diǎn)中的重點(diǎn),那就是 OpenSSL 加密擴(kuò)展的使用。為什么說它是重點(diǎn)中的重點(diǎn)呢?一是 OpenSSL 是目前 PHP 甚至是整個(gè)開發(fā)圈中的數(shù)據(jù)加密事實(shí)標(biāo)準(zhǔn),包括 HTTPS/SSL 在內(nèi)的加密都是它的實(shí)際應(yīng)用,二是 OpenSSL 提供了對稱和非對稱加密的形式,也就是我們?nèi)粘V凶钇毡榈膬煞N加密方式,這都是我們需要掌握的內(nèi)容。
那么,它和 Hash 類的加密有什么不同嗎?Hash 類的加密是單向的不可逆轉(zhuǎn)的加密,加密后的內(nèi)容是 16進(jìn)制 的 Hash 串,我們只能通過彩虹表去反推明文內(nèi)容,所以只要加上鹽值或者多套兩層加密,就非常難逆向破解出來了。因此,Hash 加密通常會用于用戶的密碼保存上,即使數(shù)據(jù)庫泄露了用戶密碼也依然是安全的。而 OpenSSL 這種類型的對稱/非對稱加密則是可以通過某個(gè)關(guān)鍵字或者證書來進(jìn)行正向加密和逆向解密的,原文
都是可以得到的。下面我們就來具體說說對稱和非對稱加密的問題。
對稱加密,通常是通過一個(gè) key(密鑰) 來對原文進(jìn)行加密。也就是說,不管是服務(wù)端還是客戶端或是其它的任何對端,在兩端通信時(shí),它們傳輸?shù)募用軆?nèi)容都必須要使用相同的 key 來進(jìn)行加/解密操作。兩端都必須同時(shí)保存這樣一個(gè) key 。估計(jì)大家也想到了,現(xiàn)在不管是 web 開發(fā)還是 app 開發(fā),代碼都是可以反編譯查看到源碼的。如果使用對稱加密的話,key 是很容易被獲取到的。不過,對稱加密的好處是速度非???,不消耗資源。
非對稱加密則是兩端持有不同的 key 。就像我們平常見到的最多的 https 證書,就是分別有 公鑰 和 私鑰 這兩個(gè)概念。一般我們會使用 公鑰 進(jìn)行加密,然后使用 私鑰 進(jìn)行解密,通常 公鑰 都是公開并發(fā)送給對方的,而私鑰是保存在自己這里的。也就是說,對方向我們發(fā)送數(shù)據(jù)的時(shí)候,使用我們給它的公鑰將數(shù)據(jù)進(jìn)行加密,數(shù)據(jù)在傳輸過程中就非常安全,因?yàn)橹虚g并沒有別人有可以解密這段數(shù)據(jù)的私鑰,直到我們接收到數(shù)據(jù)后使用自己的私鑰進(jìn)行解密后就得到了原文數(shù)據(jù)。由于兩邊的密鑰內(nèi)容并不相同,所以相對于對稱加密來說,非對稱加密的安全性要高了很多。雖然說非對稱加密的算法和復(fù)雜度都比對稱加密提升了好幾個(gè)檔次,但相對于對稱加密的優(yōu)勢,在非對稱加密中,速度和性能也就成了它的瓶頸,特別是數(shù)據(jù)量大的情況下。另外,非對稱加密的數(shù)學(xué)原理是 大數(shù)難分解 問題,也就是越大的數(shù)越難進(jìn)行因子分解,如果某個(gè)算法能在短時(shí)間內(nèi)破解這個(gè)問題的話,那么恭喜你,現(xiàn)代加密算法的基礎(chǔ)天花板就被你捅破了。
對稱加密常用的算法有:AES 、DES 、3DES 、 IDEA 、 RC2 、 RC5 等,比較常用的是 AES 和 DES 。
非對稱加密常用的算法有:RSA 、Elgamal 、ECC 等,RSA 非常常用和普遍,SSL 和一些證書算法都是基于 RSA 。
那么,我們有沒有折衷的方式來使用這兩種加密能力呢?當(dāng)然有了,并且也是非常經(jīng)典的一種技術(shù):數(shù)字信封。
其實(shí)意思非常簡單,就是利用這兩種加密方式各自的優(yōu)點(diǎn)。非對稱加密的安全性高,但速度慢,而且數(shù)據(jù)量越大速度越慢,那么我們就用它來加密對稱加密的 key ,通常這個(gè) key 不會很大。然后實(shí)際的數(shù)據(jù)實(shí)體使用這個(gè)對稱加密的 key 來進(jìn)行對稱加密提升速度。這樣,我們發(fā)送給客戶端時(shí),就包括兩個(gè)內(nèi)容,一個(gè)是非對稱加密進(jìn)行加密的 key ,一個(gè)使用對稱加密進(jìn)行加密的數(shù)據(jù)內(nèi)容??蛻舳四玫叫畔⒑?,首先使用非對稱加密的密鑰解碼出對稱加密的 key ,然后再使用這個(gè) key 來解密最終的數(shù)據(jù)內(nèi)容。是不是說得很暈?我們通過一張圖來看看,或許大家就一目了然了。
其中,公鑰和私鑰就不用多解釋了。會話密鑰就是我們的對稱加密算法的密鑰 key 。結(jié)合上面對數(shù)字信封傳輸過程的解釋,大家應(yīng)該就能看懂了吧。
好了,介紹這么多理論知識,接下來還是回歸正題了,我們在 PHP 中如何實(shí)現(xiàn)對稱和非對稱加密呢?非常簡單,使用 OpenSSL 擴(kuò)展就可以了。這個(gè)擴(kuò)展也是隨 PHP 源碼一起發(fā)布的,編譯安裝的時(shí)候加上 --with-openssl 就可以了。當(dāng)然,它也是需要系統(tǒng)環(huán)境中安裝 OpenSSL 軟件的,在各類操作系統(tǒng)中基本都已經(jīng)直接有了,如果沒有的話就自己安裝一下即可。最簡單的,在操作系統(tǒng)命令行看看有沒有 openssl 命令就可以看出當(dāng)前系統(tǒng)有沒有安裝 OpenSSL 相關(guān)的軟件。
[root@localhost ~]# openssl version OpenSSL 1.1.1 FIPS 11 Sep 2018
今天,我們主要學(xué)習(xí)的還是比較簡單的對稱加密相關(guān)的函數(shù)。
$data = '測試對稱加密'; $key = '加密用的key'; $algorithm = 'DES-EDE-CFB'; $ivlen = openssl_cipher_iv_length($algorithm); $iv = openssl_random_pseudo_bytes($ivlen); $password = openssl_encrypt($data, $algorithm, $key, 0, $iv); echo $password, PHP_EOL; // 4PvOc75QkIJ184/RULdOTeO8 echo openssl_decrypt($password, $algorithm, $key, 0, $iv), PHP_EOL; // 測試對稱加密 // Warning: openssl_encrypt(): Using an empty Initialization Vector (iv) is potentially insecure and not recommended
openssl_encrypt() 就是加密數(shù)據(jù),它需要原文、算法和密鑰三個(gè)參數(shù),后面的參數(shù)是可選的,但是現(xiàn)在是推薦自己來定義 iv (向量) 參數(shù),所以如果沒有 iv 參數(shù)的話,會報(bào)一個(gè)警告信息。我們使用 openssl_cipher_iv_length() 來獲取當(dāng)前算法需要的 iv 長度,然后使用 openssl_random_pseudo_bytes() 函數(shù)來生成一個(gè)隨機(jī)的符合算法長度的 iv 內(nèi)容。
中間那個(gè) 0 的參數(shù)是指定標(biāo)記的按位或值,它有兩個(gè)可選常量:OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING ,如果設(shè)置為 OPENSSL_RAW_DATA 加密后的數(shù)據(jù)將按照原樣返回(二進(jìn)制亂碼內(nèi)容),如果設(shè)置為 OPENSSL_ZERO_PADDING ,加密后的數(shù)據(jù)將返回為 base64 之后的內(nèi)容。
openssl_decrypt() 用于對數(shù)據(jù)進(jìn)行解密,需要的參數(shù)基本和加密函數(shù)一致,只是原文數(shù)據(jù)換成了加密數(shù)據(jù)。
在對稱加密中,我們還有一種 AEAD 密碼模式(GCM 或 CCM) ,在使用這種模式的算法時(shí),我們需要多一參數(shù)。
$algorithm = 'aes-128-gcm'; $password = openssl_encrypt($data, $algorithm, $key, 0, $iv, $tags); echo $password, PHP_EOL; // dPYsR+sdP56rQ99CNxciah+N echo openssl_decrypt($password, $algorithm, $key, 0, $iv, $tags), PHP_EOL; // 測試對稱加密
這個(gè) $tags 是一個(gè)引用類型的參數(shù),也就是加密后會賦值到這個(gè)變量中,解密的時(shí)候也需要相同的這個(gè)驗(yàn)證標(biāo)簽。
從加密解密的過程來看,如果我們要將這些信息保存在數(shù)據(jù)庫中,或者進(jìn)行傳輸解密時(shí),我們至少要保存或傳輸這幾個(gè)字段,加密使用的 iv ,加密使用的算法,以及 AEAD 模式的話加密所使用的驗(yàn)證標(biāo)簽,否則數(shù)據(jù)無法解密。
print_r(openssl_get_cipher_methods()); // Array // ( // [0] => AES-128-CBC // [1] => AES-128-CBC-HMAC-SHA1 // [2] => AES-128-CFB // [3] => AES-128-CFB1 // [4] => AES-128-CFB8 // [5] => AES-128-CTR // [6] => AES-128-ECB // [7] => AES-128-OFB // [8] => AES-128-XTS // [9] => AES-192-CBC // [10] => AES-192-CFB // [11] => AES-192-CFB1 // [12] => AES-192-CFB8 // …… // )
上述內(nèi)容就是如何在PHP中使用OpenSSL加密,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。