本篇文章給大家分享的是有關(guān)怎么在php中利用mcrypt實(shí)現(xiàn)一個(gè)加密解密功能,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)專注于黟縣網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供黟縣營(yíng)銷型網(wǎng)站建設(shè),黟縣網(wǎng)站制作、黟縣網(wǎng)頁(yè)設(shè)計(jì)、黟縣網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造黟縣網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供黟縣網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。PHP中自帶了相當(dāng)多的加密的方法,這里我們來看一下mcrypt擴(kuò)展的使用方式。也是在工作中需要用這個(gè)東西加密訪問用戶的Cookie的值,認(rèn)真的學(xué)習(xí)了這個(gè)方面的內(nèi)容。
1.簡(jiǎn)介
Mcrypt是PHP的一個(gè)擴(kuò)展,完成了常用加密算法的封裝。其實(shí)該擴(kuò)展是對(duì)mcrypt標(biāo)準(zhǔn)類庫(kù)的封裝,mcrypt完成了相當(dāng)多的常用加密算法,如DES, TripleDES, Blowfish (default), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, RC2 和 GOST加密算法,并且提供了CBC、OFB、CFB 和 ECB 四種塊加密的模型。
2.安裝和使用
要使用該擴(kuò)展,必須首先安裝mcrypt標(biāo)準(zhǔn)類庫(kù),可以在/tupian/20230522/ 下載。該擴(kuò)展的編譯和安裝方式和常規(guī)的php擴(kuò)展相同,不在詳細(xì)說明了。
3.四種塊加密模型
Mcrypt支持四種塊加密模型,簡(jiǎn)要說明如下:
①. MCRYPT_MODE_ECB(electronic codebook) 適合對(duì)小數(shù)量隨機(jī)數(shù)據(jù)的加密,比如加密用戶的登錄密碼之類的。
②. MCRYPT_MODE_CBC (cipher block chaining) 適合加密安全等級(jí)較高的重要文件類型。
③. MCRYPT_MODE_CFB (cipher feedback) 適合于需要對(duì)數(shù)據(jù)流的每一個(gè)字節(jié)進(jìn)行加密的場(chǎng)合。
④. MCRYPT_MODE_OFB (output feedback, in 8bit) 和CFB模式兼容,但比CFB模式更安全。CFB模式會(huì)引起加密的錯(cuò)誤擴(kuò)散,如果一個(gè)byte出錯(cuò),則其后續(xù)的所有byte都會(huì)出錯(cuò)。OFB模式則不會(huì)有此問題。但該模式的安全度不是很高,不建議使用。
⑤. MCRYPT_MODE_NOFB (output feedback, in nbit) 和OFB兼容,由于采用了塊操作算法,安全度更高。
⑥. MCRYPT_MODE_STREAM 是為了WAKE或者RC4等流加密算法提供的額外模型。
NOFB和STREAM僅當(dāng)mycrypt的版本號(hào)大于等于libmcrypt-2.4.x才有效。(現(xiàn)在基本上都是大于這個(gè)版本了,libmcrypt的新主版本已經(jīng)到4了)
4.查看支持的算法和模型
①. mcrypt_list_modes()列出當(dāng)前環(huán)境支持的模型
②. mcrypt_list_algorithms()列出當(dāng)前環(huán)境支持的算法
如命令行執(zhí)行:
復(fù)制代碼 代碼如下:
php -r "var_dump(mcrypt_list_modes()); var_dump(mcrypt_list_algorithms());"
即可列出所有的結(jié)果。
5.如何使用
示例1:
復(fù)制代碼 代碼如下:
$key = "this is a secret key";
$input = "Let us meet at 9 o'clock at the secret place.";
$encrypted_data = mcrypt_ecb (MCRYPT_3DES, $key, $input, MCRYPT_ENCRYPT);
?>
最簡(jiǎn)單的方式如示例1中所示,該方法表明對(duì)$input使用3DES的算法進(jìn)行加密,加密密鑰是$key.不過這中直接調(diào)用的方法已經(jīng)不被官方推薦使用,也建議大家在開發(fā)中不要使用此種方式,不一定哪天該方法就不能用了。在php5下使用此種方式調(diào)用時(shí),能看到一條warning信息,提示“PHP Warning: attempt to use an empty IV, which is NOT recommend”。
官方推薦的使用方式如示例2所示
示例2:
復(fù)制代碼 代碼如下:
$key = "this is a secret key";
$input = "Let us meet at 9 o'clock at the secret place.";
// 打開mcrypt,或者mcrypt類型的資源對(duì)象,該對(duì)象使用ecb模式,使用3des作為加密算法。
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
// 創(chuàng)建iv(初始化向量)
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
// 根據(jù)密鑰和iv初始化$td,完成內(nèi)存分配等初始化工作
mcrypt_generic_init($td, $key, $iv);
// 進(jìn)行加密
$encrypted_data = mcrypt_generic($td, $input);
// 反初始化$td,釋放資源
mcrypt_generic_deinit($td);
// 關(guān)閉資源對(duì)象,退出
mcrypt_module_close($td);
?>
上述過程完成了數(shù)據(jù)的加密過程。首先選擇加密算法和加密模式創(chuàng)建mcrypt的資源對(duì)象和IV,然后初始化加密所需的buffer(內(nèi)存),進(jìn)行加密后再釋放buffer,最后關(guān)閉資源對(duì)象。
解密的過程和加密是基本相同,只要把mcrypt_generic($td, $input)替換成mdecrypt_generic($td, $input)就可以了,其它部分完全相同。當(dāng)然,對(duì)于3des這種對(duì)稱加密算法而言,加密、解密所用的key是必須完全相同的。
6. 有關(guān)IV
不是所有的模型中都需要IV. CFB和OFB是必須有IV, CBC和EBC則是可選的。對(duì)于必選IV的模式來說,其加密和解密的IV的值必須完全相同,CBC和EBC則無此要求??梢韵嗤部梢圆煌?,沒什么關(guān)系。
7.一個(gè)簡(jiǎn)單功能的加密解密類
class AMPCrypt { private static function getKey(){ return md5('exampleKey'); } public static function encrypt($value){ $td = mcrypt_module_open('tripledes', '', 'ecb', ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM); $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td)); mcrypt_generic_init($td, $key, $iv); $ret = base64_encode(mcrypt_generic($td, $value)); mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } public static function dencrypt($value){ $td = mcrypt_module_open('tripledes', '', 'ecb', ''); $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM); $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td)); $key = substr(self::getKey(), 0, mcrypt_enc_get_key_size($td)); mcrypt_generic_init($td, $key, $iv); $ret = trim(mdecrypt_generic($td, base64_decode($value))) ; mcrypt_generic_deinit($td); mcrypt_module_close($td); return $ret; } }
以上就是怎么在php中利用mcrypt實(shí)現(xiàn)一個(gè)加密解密功能,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。