PHP的Mcrypt加密擴(kuò)展知識了解今天我們來學(xué)習(xí)的是 PHP 中的一個過時的擴(kuò)展 Mcrypt 。在 PHP7 之前,這個擴(kuò)展是隨 PHP 安裝包一起內(nèi)置發(fā)布的,但是現(xiàn)在新版本的 PHP 中已經(jīng)沒有了,需要使用這個擴(kuò)展的話我們需要單獨安裝,并且在使用的時候也是會報出過時的警告的。所以,我們學(xué)習(xí)使用這些函數(shù)的時候,就需要使用 @ 來抑制錯誤信息。當(dāng)然,之所以會對這套擴(kuò)展發(fā)出過時警告,是因為 PHP 更加推薦使用 OpenSSL 來處理類似的加密能力。 模塊和算法Mcrypt 主要是使用的 Mcrypt 工具來進(jìn)行加密操作的,所以在 CentOS 或者其它操作系統(tǒng)中,我們需要安裝 libmcrypt-devel 來使用這個擴(kuò)展。如果 yum 中無法安裝的話,直接更新 yum 源即可。 Mcrypt 包含很多的模塊和算法。算法就不用多解釋了,就是用來對數(shù)據(jù)進(jìn)行加密的方式。而模塊,包括 CBC, OFB,CFB 和 ECB 這幾種,是一系列的分組、流式加密的模式,有推薦的模塊,也有安全的模塊,具體的區(qū)分大家可以自行查閱相關(guān)的資料,這里我們先看一下我們的環(huán)境中所支持的模塊和算法。 $algorithms = @mcrypt_list_algorithms();mcrypt_list_algorithms() 函數(shù)可以獲得當(dāng)前環(huán)境下所有支持的 Mcrypt 算法。而 mcrypt_list_modes() 則打印出了當(dāng)前環(huán)境下所有可支持的模塊。注意在某些版本的 PHP 或者某些系統(tǒng)中,這些內(nèi)容會有所不同,在使用 Mcrypt 相關(guān)的加密能力的時候,這兩項都是相互配合使用的。因此,我們有必要在需要運行 Mcrypt 的環(huán)境中預(yù)先確定好當(dāng)前環(huán)境下所支持的模塊和算法。 加密解密數(shù)據(jù)$key = hash('sha256', 'secret key', true);代碼比較多也較亂,我們一塊一塊來看。 首先是我們確定一個加密的 key ,然后 input 就是我們要加密的數(shù)據(jù)。比如我們要加密一個 json 數(shù)據(jù)。這個 key 其實用字符串就可以,但我們這里也對 key 進(jìn)行了一次 hash 處理,這個 hash 相關(guān)的內(nèi)容在上一篇文章我們已經(jīng)詳細(xì)的講解過了。 接下來就是使用 mcrypt_module_open() 打開一個加密模塊句柄,這里我們使用 rijndael-128 算法和 cbc 模塊。然后使用 mcrypt_create_iv() 創(chuàng)建一個 iv ,這個 iv 就是一個初始化向量。初始化向量的值依密碼算法而不同。最基本的要求是“唯一性”,也就是說同一把密鑰不重復(fù)使用同一個初始化向量。這個特性無論在分組加密或流加密中都非常重要。相信大家要是做過微信或支付寶相關(guān)的接口通信,在解密驗證數(shù)據(jù)的時候一定會見過這個 iv 屬性。 使用 mcrypt_generic() 生成加密結(jié)果,使用 mcrypt_generic_deinit() 結(jié)束生成初始化,最后通過 mcrypt_module_close() 關(guān)閉加密模塊句柄。這樣,一套 Mcrypt 加密流程就完成了。 同樣的,解密流程和加密流程也是類似的,只是我們使用 mdecrypt_generic() 這個函數(shù)來進(jìn)行解密就可以了。 另一種加密解密數(shù)據(jù)方式上面的加密流程非常麻煩而且復(fù)雜,其實在 Mcrypt 中還提供了一種更簡單的加密函數(shù)。 $string = 'Test MCrypt2';我們依然要準(zhǔn)備好要加密的數(shù)據(jù),算法,key ,以及 iv 向量。然后直接使用 mcrypt_encrypt() 和 mcrypt_decrypt() 來進(jìn)行加/解密就可以了,是不是方便很多。 總結(jié)相對于 Hash 來說,Mcrypt 是可解密的對稱加密形式。關(guān)于什么是對稱和非對稱加密,我們將在 OpenSSL 擴(kuò)展的學(xué)習(xí)中詳細(xì)地講解,而 Hash 加密則是單向的加密形式,是無法通過加密后的數(shù)據(jù)反向計算獲得原始數(shù)據(jù)的。它們都有不同的應(yīng)用場景,不過就像 PHP 提示的那樣,Mcrypt 已經(jīng)是不推薦使用的擴(kuò)展了,所以我們在這里只是簡單的進(jìn)行了加/解密的測試而已,如果有用到的小伙伴,可以根據(jù)手冊進(jìn)行更深入地學(xué)習(xí)。 測試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84Mcrypt%E5%8A%A0%E5%AF%86%E6%89%A9%E5%B1%95%E7%9F%A5%E8%AF%86%E4%BA%86%E8%A7%A3.php 參考文檔: https://www./manual/zh/book.mcrypt.php https://ask.csdn.net/questions/700696 |
|
|