明天咱们来学习的是 PHP 中的一个过期的扩大 Mcrypt 。在 PHP7 之前,这个扩大是随 PHP 安装包一起内置公布的,然而当初新版本的 PHP 中曾经没有了,须要应用这个扩大的话咱们须要独自装置,并且在应用的时候也是会报出过期的正告的。所以,咱们学习应用这些函数的时候,就须要应用 @ 来克制错误信息。当然,之所以会对这套扩大收回过期正告,是因为 PHP 更加举荐应用 OpenSSL 来解决相似的加密能力。

模块和算法

Mcrypt 次要是应用的 Mcrypt 工具来进行加密操作的,所以在 CentOS 或者其它操作系统中,咱们须要装置 libmcrypt-devel 来应用这个扩大。如果 yum 中无奈装置的话,间接更新 yum 源即可。

Mcrypt 蕴含很多的模块和算法。算法就不必多解释了,就是用来对数据进行加密的形式。而模块,包含 CBC, OFB,CFB 和 ECB 这几种,是一系列的分组、流式加密的模式,有举荐的模块,也有平安的模块,具体的辨别大家能够自行查阅相干的材料,这里咱们先看一下咱们的环境中所反对的模块和算法。

$algorithms = @mcrypt_list_algorithms();print_r($algorithms);// Array// (//     [0] => cast-128//     [1] => gost//     [2] => rijndael-128//     [3] => twofish//     [4] => arcfour//     [5] => cast-256//     [6] => loki97//     [7] => rijndael-192//     [8] => saferplus//     [9] => wake//     [10] => blowfish-compat//     [11] => des//     [12] => rijndael-256//     [13] => serpent//     [14] => xtea//     [15] => blowfish//     [16] => enigma//     [17] => rc2//     [18] => tripledes// )$modes = @mcrypt_list_modes();print_r($modes);// Array// (//     [0] => cbc//     [1] => cfb//     [2] => ctr//     [3] => ecb//     [4] => ncfb//     [5] => nofb//     [6] => ofb//     [7] => stream// )

mcrypt_list_algorithms() 函数能够取得以后环境下所有反对的 Mcrypt 算法。而 mcrypt_list_modes() 则打印出了以后环境下所有可反对的模块。留神在某些版本的 PHP 或者某些零碎中,这些内容会有所不同,在应用 Mcrypt 相干的加密能力的时候,这两项都是相互配合应用的。因而,咱们有必要在须要运行 Mcrypt 的环境中预先确定好以后环境下所反对的模块和算法。

加密解密数据

$key = hash('sha256', 'secret key', true);$input = json_encode(['id'=>1, 'data'=>'Test mcrypt!']);$td = @mcrypt_module_open('rijndael-128', '', 'cbc', '');$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);@mcrypt_generic_init($td, $key, $iv);$encrypted_data = @mcrypt_generic($td, $input);@mcrypt_generic_deinit($td);@mcrypt_module_close($td);echo $encrypted_data, PHP_EOL;// ��I      $�3���gE�ǣu(�9n�����//                            p�>P$td = @mcrypt_module_open('rijndael-128', '', 'cbc', '');@mcrypt_generic_init($td, $key, $iv);$data = @mdecrypt_generic($td, $encrypted_data);echo $data, PHP_EOL;// {"id":1,"data":"Test mcrypt!"}@mcrypt_generic_deinit($td);@mcrypt_module_close($td);

代码比拟多也较乱,咱们一块一块来看。

首先是咱们确定一个加密的 key ,而后 input 就是咱们要加密的数据。比方咱们要加密一个 json 数据。这个 key 其实用字符串就能够,但咱们这里也对 key 进行了一次 hash 解决,这个 hash 相干的内容在上一篇文章咱们曾经具体的解说过了。

接下来就是应用 mcrypt_module_open() 关上一个加密模块句柄,这里咱们应用 rijndael-128 算法和 cbc 模块。而后应用 mcrypt_create_iv() 创立一个 iv ,这个 iv 就是一个初始化向量。初始化向量的值依明码算法而不同。最根本的要求是“唯一性”,也就是说同一把密钥不重复使用同一个初始化向量。这个个性无论在分组加密或流加密中都十分重要。置信大家要是做过微信或支付宝相干的接口通信,在解密验证数据的时候肯定会见过这个 iv 属性。

应用 mcrypt_generic() 生成加密后果,应用 mcrypt_generic_deinit() 完结生成初始化,最初通过 mcrypt_module_close() 敞开加密模块句柄。这样,一套 Mcrypt 加密流程就实现了。

同样的,解密流程和加密流程也是相似的,只是咱们应用 mdecrypt_generic() 这个函数来进行解密就能够了。

另一种加密解密数据形式

下面的加密流程十分麻烦而且简单,其实在 Mcrypt 中还提供了一种更简略的加密函数。

$string = 'Test MCrypt2';$algorithm = 'rijndael-128';$key = md5( "mypassword", true);$iv_length = @mcrypt_get_iv_size( $algorithm, MCRYPT_MODE_CBC );$iv = @mcrypt_create_iv( $iv_length, MCRYPT_RAND );$encrypted = @mcrypt_encrypt( $algorithm, $key, $string, MCRYPT_MODE_CBC, $iv );$result = @mcrypt_decrypt( $algorithm, $key, $encrypted, MCRYPT_MODE_CBC, $iv );echo $encrypted, PHP_EOL; // \<�`�U��Uf)�Yecho $result, PHP_EOL; // Test MCrypt2

咱们仍然要筹备好要加密的数据,算法,key ,以及 iv 向量。而后间接应用 mcrypt_encrypt() 和 mcrypt_decrypt() 来进行加/解密就能够了,是不是不便很多。

总结

绝对于 Hash 来说,Mcrypt 是可解密的对称加密模式。对于什么是对称和非对称加密,咱们将在 OpenSSL 扩大的学习中具体地解说,而 Hash 加密则是单向的加密模式,是无奈通过加密后的数据反向计算取得原始数据的。它们都有不同的利用场景,不过就像 PHP 提醒的那样,Mcrypt 曾经是不举荐应用的扩大了,所以咱们在这里只是简略的进行了加/解密的测试而已,如果有用到的小伙伴,能够依据手册进行更深刻地学习。

测试代码:

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.php.net/manual/zh/book.mcrypt.php

https://ask.csdn.net/questions/700696

各自媒体平台均可搜寻【硬核项目经理】