摘要:废弃加密方法替换方案前瞻最近,我负责在重构项目的支付渠道,因为之前都是接一个渠道在的方式,代码显的比较混乱,恰巧整体项目在微服务化,所以我们决定将支付做成一个微服务,独立出来。
PHP7.1废弃加密方法替换方案 前瞻
最近,我负责在重构项目的支付渠道,因为之前都是接一个渠道在ifelse的方式,代码显的比较混乱,恰巧整体项目在微服务化,所以我们决定将支付做成一个微服务,独立出来。当前比较热门的支付渠道,比如说支付宝、微信等,做支付业务比较早,文档相对来说,或者整个的支付方案是比较成熟的。前面接的都是比较顺利的。但是,我们还接入了京东金融,可能京东金融支付做的比较晚,文档肯定比不上前面的两家,最最最操蛋的是JD提供的工具类中的encrypted方法是使用mcrypt_encrypt那么问题来了。
首先,我们来看一下PHP官方网站的备注。
mcrypt_encrypt
(PHP 4 >= 4.0.2, PHP 5, PHP 7)
mcrypt_encrypt — 使用给定参数加密明文
注意,下面还有一个爆炸点:
Warning
This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.
string mcrypt_encrypt ( string $cipher , string $key , string $data , string $mode [, string $iv ] )
what? php7.1已经不再支持了。官方来的太突然,我觉得在PHP7.0这个大版本就应该直接淘汰了,但是在小版本淘汰,有点操蛋。刚好我们项目就是使用是已经在7.1版本了,没办法只能寻找替代方案。
原方案之前所有的php版本对3des加密方式都是类似如下代码,加密方式是没问题的。
$size = mcrypt_get_block_size ( "des", "ecb" ); $td = mcrypt_module_open ( MCRYPT_3DES, "", "ecb", "" ); $iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND ); // 使用MCRYPT_3DES算法,cbc模式@mcrypt_generic_init ( $td, $key, $iv ); // 初始处理 $data = mcrypt_generic ( $td, $input ); // 加密 mcrypt_generic_deinit ( $td ); // 结束 mcrypt_module_close ( $td ); return $data;替代方案
官方貌似是没有给到替代方案,其实我们其实在很多场景下都在使用一种加密方式。那就是openssl,
我们使用的是openssl_encrypt。我们看一下官方。
openssl_encrypt
(PHP 5 >= 5.3.0, PHP 7)
openssl_encrypt — 加密数据
说明:以指定的方式和 key 加密数据,返回原始或 base64 编码后的字符串。
string openssl_encrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string &$tag = NULL [, string $aad = "" [, int $tag_length = 16 ]]]]] )
针对上面的那段代码,
$data = openssl_encrypt($input,"des-ede3",$key,0);
what?一行代码搞定了? Yes,对的就是一行代码搞定了。但是,openssl_encrypt加密会按照加密模式进行加密,之后还会进行base64加密一下,哈哈哈,所以需要进行解密
base64_decode($data);
此刻已经加密完成,可以进行京东支付了。
解密同样,加密解密肯定是同步的,既然官方已经不支持这种方式加密,当然解密方式在7.1也是被抛弃了。mdecrypt_generic
mdecrypt_generic
(PHP 4 >= 4.0.2, PHP 5, PHP 7)
mdecrypt_generic — 解密数据
string mdecrypt_generic ( resource $td , string $data )
解密数据。 请注意,由于存在数据补齐的情况, 返回字符串的长度可能和明文的长度不相等。
Warning
This function has been DEPRECATED as of PHP 7.1.0. Relying on this function is highly discouraged.
$td = mcrypt_module_open ( MCRYPT_3DES, "", "ecb", "" ); // 使用MCRYPT_DES算法,cbc模式 $iv = @mcrypt_create_iv ( mcrypt_enc_get_iv_size ( $td ), MCRYPT_RAND ); $ks = mcrypt_enc_get_key_size ( $td ); @mcrypt_generic_init ( $td, $key, $iv ); // 初始处理 $decrypted = mdecrypt_generic ( $td, $encrypted ); // 解密 mcrypt_generic_deinit ( $td ); // 结束 mcrypt_module_close ( $td ); //$y = TDESUtil::pkcs5Unpad ( $decrypted ); return $decrypted;
openssl_decrypt
openssl_decrypt
(PHP 5 >= 5.3.0, PHP 7)
openssl_decrypt — Decrypts data
说明
string openssl_decrypt ( string $data , string $method , string $key [, int $options = 0 [, string $iv = "" [, string $tag = "" [, string $aad = "" ]]]] )
Takes a raw or base64 encoded string and decrypts it using a given method and key.
解密替代方案:
$decrypted = openssl_decrypt($encrypted,"des-ede3",$key,OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); // 解密
同样是一行代码,同样这个也是会多加操作的,同样也是base64。
后记(骚话)其实,对于openssl_encrypt和mcrypt_encrypt,openssl_encrypt支持的加密方式更加多,就如同我在开篇所说的,我更希望是在大版本更替的时候淘汰掉这些,因为这样引起的关注度会比较高,在小版本迭代中不会引起那么多关注度。所以即使你没因为版本遇到这个问题,我也希望你用到了就替换掉,openssl支持的比较全面,版本目前也比较多。
参考资料php.net :http://php.net/manual/zh/ref....
wiki: https://wiki.openssl.org/inde...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/25714.html
摘要:扩展已经过时了大约年,并且用起来很复杂。因此它被废弃并且被所取代。从起它将被从核心代码中移除并且移到中。手册在迁移页面给出了替代方案就是用取代加密,支持加密要加密的数据加密加密后的数据解密要解密的数据加密解密后的数据可据需求,自行改编。 mcrypt 扩展已经过时了大约10年,并且用起来很复杂。因此它被废弃并且被 OpenSSL 所取代。 从PHP 7.2起它将被从核心代码中移除并且移...
摘要:大家可以根据代码不同的填充方式来选择不同的替换方案,但其中有三个细节需要说明为什么要有填充用替换后算法的名称为何不同接下来会则会具体分析填充算法。 PHP7.1中使用openssl替换mcrypt 在php开发中,使用mcrypt相关函数可以很方便地进行AES加、解密操作,但是PHP7.1中废弃了mcrypt扩展,所以必需寻找另一种实现。在迁移手册中已经指出了用openssl代替mcr...
摘要:也可以接入项目打包测试流程做代码检测。扩展替换以后废弃了和扩展,项目中使用的使用的类使用的是已经废弃的扩展使用扩展做兼容替换。测试方案和大部分公司差不多,项目组划分了线下开发环境预发布环境和生产环境三个环境。 项目由PHP5.5切换至PHP7.1.15 背景 从2015年鸟哥的技术分享,我们知道PHP7是对底层实现得一次完全重构,函数调用机制和内存管理等很多方便做了优化,使PHP性能有...
摘要:项目背景因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用加密,后端使用解密在网络上搜索了很多的方法,但是大部分的都是使用和进行端的加解密,但是众所周知的问题,这两个方法在以后将会被废弃,故而采用。 项目背景 因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用js加密,后端使用php解密 在网络上搜索了很多的方法,但是大部分的都是使...
摘要:项目背景因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用加密,后端使用解密在网络上搜索了很多的方法,但是大部分的都是使用和进行端的加解密,但是众所周知的问题,这两个方法在以后将会被废弃,故而采用。 项目背景 因为自己开发的接口希望在传递的工程中可以保证参数是密文的形式,主要是前端使用js加密,后端使用php解密 在网络上搜索了很多的方法,但是大部分的都是使...
阅读 2781·2023-04-25 17:59
阅读 647·2023-04-25 15:05
阅读 602·2021-11-25 09:43
阅读 2993·2021-10-12 10:13
阅读 3499·2021-09-27 13:59
阅读 3512·2021-09-23 11:21
阅读 3756·2021-09-08 09:35
阅读 517·2019-08-29 17:12