PHP7.1废弃加密方法替换方案

码影逐风说
• 阅读 15046

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...

点赞
收藏
评论区
推荐文章
vue h5 对接支付宝,微信支付,微信js支付
vueh5实现支付(支付宝,微信)h5端实现支付难度不大,只是有些小的点需要注意下,其他的看文档撸就行了。支付宝很简单,后端返回一个html,前端插入调用就行了,微信支付分两种:1、微信内支付(jsapi,微信内浏览器)2、微信外支付(h5支付)。一、支付宝支付//前端啥都不用管,交给后端去干,返回html调用点击就好了/
Easter79 Easter79
3年前
thinkcmf+jsapi 实现微信支付
首先从小程序端接收订单号、金额等参数,然后后台进行统一下单,把微信支付的订单号返回,在把订单号发送给前台,前台拉起支付,返回参数后更改支付状态。。。回调publicfunctionnotify(){$wechatDb::name('wechat')where('status',1)find();
展菲 展菲
4年前
iOS 微信支付开发(最新版)
1.介绍本文为以前做的项目总结,由于相关支付SDK迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结。项目中要用到支付功能,需要支付宝支付、微信支付、银联支付、Apple_pay,所以打算总结一下,方便以后的查阅,也方便大家,用到的地方避免再次被坑。今天我们就主要介绍一下微信支付,其他支付介绍后面会尽快更新出来。
展菲 展菲
4年前
iOS 支付宝支付开发(最新版)
1.介绍本文为以前做的项目总结,由于相关支付SDK迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结。今天我们就主要介绍一下支付宝支付,其他支付介绍后面会尽快更新出来。在做支付之前,在网上也查寻了资料,大多都说,支付接入坑太多,微信坑最多,银联文档太复杂。其实如果接入的多的话,那些套路都可以绕着走。网上的经验什么的
Karen110 Karen110
4年前
Python项目实战——手把手教你使用Django框架实现支付宝付款
一、前言大家好,我是Python进阶者。春节即将过去,大家过年期间肯定各种掏腰包花花花,小编相信大家在支付时候,微信、支付宝支付肯定是优先选择。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用Pythonweb框架Django来实现支付宝支付,废话不多说,一起来看看如何实现吧。二、建立django应用我们来建立一个Django项目然后在里面创建
Wesley13 Wesley13
3年前
h5 接入微信支付
我们公司,现在用ping做h5接入,用的是h5"壹收款"准备:如果公司,现在还没有公众号的话,支付宝。可以把这些工作,给ping来做这些事情 1.注册微信公众号,开通支付功能。2.注册ping (如果是自己开开通的微信支付,要填写相关信息)3.微信设置网页授权获取用户基本信
Wesley13 Wesley13
3年前
@PostConstruct注解,你该好好看看
在最近的工作中,get到一个很实用的注解,分享给诸位。痛点做过微信或支付宝支付的童鞋,可能遇到过这种问题,就是填写支付结果回调,就是在支付成功之后,支付宝要根据我们给的地址给我们进行通知,通知我们用户是否支付成功,如果成功我们就要去处理下面相应的业务逻辑,如果在测试服务,那么这个回调地址我们就需要填写测试服务的,如果发布到线上那么我们就需要改成
Wesley13 Wesley13
3年前
B2B或B2C或B2B2C平台如何实现结算功能
问:B2C商城,在对每个商家结算时,必须要直接结算到微信支付宝银行卡,而不能先结算到平台上,之后自行提现吗?据说这是法律限制,是因为没有支付牌照吗?如果是这样的话,那么系统的设计是从微信/..等支付的时候,就是用商家的微信账户,还是在结算时使用统一的账户打入商家账户中?答:的确是因为牌照的关系,因为你做B2C电商,提供服务的是
Stella981 Stella981
3年前
IOS9 微信支付报 prepayid 获取失败 ErrorDomainSSL,
微信支付或访问一些网站时报错:SDKSample\669:19724\NSURLSession/NSURLConnectionHTTPloadfailed(kCFStreamErrorDomainSSL,9802)原因是:IOS9中将http请求改成了HTTPS(加密)的方式解决:在项目的info.p
Wesley13 Wesley13
3年前
TYPESDK手游聚合SDK服务端设计思路与架构之三:流程优化之订单保存与通知
经过前两篇文字的分析与设计,我们已经可以搭建出一个能够支持多游戏多渠道的聚合SDK服务端,但这只是理想化状态下的一个简化模型。如果接入渠道的逻辑都是按照理想化的简化过程来构建,那么对于支付的请求,我们可以简化成这样几步:1.游戏客户端创建订单。2.游戏客户端(通过TYPESDK客户端)调用渠道lib库中相应接口,发起支付。3.用户在弹出的
码影逐风说
码影逐风说
Lv1
坐到三更尽,归仍万里赊。
文章
5
粉丝
0
获赞
0