宝哥软件园

PHP 7.1中用OpenSSL代替Mcrypt的加密解密方法详解

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

总结:

php7.1发布后,新功能吸引了很多PHPer,大家都在讨论新功能带来的好处和便利。然而,从php7.0升级到php7.1过时了过去广泛使用的扩展(mcrypt扩展)。官方提供了相应的解决方案,但没有提供更详细的解决方案。于是坑来了:

今天用微信开放平台对接一个内容管理系统,绑定微信官方账号的时候已经失败了

原因:

调试时发现直接原因是开放平台填写的授权事件(授权事件每十分钟会发送一个事件更新票证),即:

这个地方填写的url,调试发现这个URL是正确的,微信也是每10分钟推送一次,但最后还是没有收到票,从微信解密数据的时候发现代码错误:

?php函数aes_decode($message,$encodingaeskey=' ',$ appid=' '){ $ key=base64 _ decode($ encoding aeskey)。'=');$密文_ dec=base64 _ decode($ message);$iv=substr($key,0,16);$ module=MCRYPT _ module _ open(MCRYPT _ RIJNDAEL _ 128 ' ',MCRYPT _ MODE _ CBC ' ');mcrypt_generic_init($module,$key,$ iv);$ decrypted=mdecrypt _ generic($ module,$密文_ dec);MC rypt _ generic _ definit($ module);MC rypt _ module _ close($ module);$ pad=order(substr($解密,-1));if($ pad 1 | | $ pad 32){ $ pad=0;}也就是这个地方,因为我的环境是PHP 7.1,我发现PHP 7.1已经放弃了Mcrypt,所以这段代码中的mcrypt_*无法运行。

解决方法:

查资料发现,Mcrypt可以用OpenSSL替代(前提是已经安装了OpenSSL扩展,但通常是默认安装的)

Openssl是一个强大的工具包,它集成了许多密码算法和实用工具。我们不仅可以使用它提供的命令控制台工具生成密钥和证书对文件进行加密和解密,还可以使用它提供的API接口对代码中的传输信息进行加密。

因此,上面的代码可以更改为:

?php函数aes_decode($message,$encodingaeskey=' ',$ appid=' '){ $ key=base64 _ decode($ encoding aeskey)。'=');$密文_ dec=base64 _ decode($ message);$iv=substr($key,0,16);/* mcrypt对称解密代码在PHP7.1中已经放弃,所以使用下面的openssl代替$ module=MCrypt _ module _ open(MCrypt _ Rijndael _ 128 ' ',MCrypt _ mode _ CBC ' ');mcrypt_generic_init($module,$key,$ iv);$ decrypted=mdecrypt _ generic($ module,$密文_ dec);MC rypt _ generic _ definit($ module);MC rypt _ module _ close($ module);*/$ decrypted=OPENSSL _decrypt($密文_ dec,' AES-256-CBC ',$key,OPENSSL _ RAW _ DATA | OPENSSL _ ZERO _ PADDING,$ iv);$ pad=order(substr($解密,-1));if($ pad 1 | | $ pad 32){ $ pad=0;}补充:

上面的解密已经修改,所以相应的Mcrypt加密也需要修改。如果不改,不发布全网、不推送消息等事件加密的源代码如下:

?php函数aes_encode($message,$encodingaeskey=' ',$ appid=' '){ $ key=base64 _ decode($ encoding aeskey)。'=');$text=random(16)。pack('N ',strlen($message))。$消息。$ appid$iv=substr($key,0,16);$ block _ size=32$ text _ length=strlen($ text);$ amount _ to _ pad=$ block _ size-($ text _ length % $ block _ size);if($ amount _ to _ pad==0){ $ amount _ to _ pad=$ block _ size;} $ pad _ chr=chr($ amount _ to _ pad);$ tmp=for($ index=0;$ index $ amount _ to _ pad$index ) { $tmp。=$ pad _ chr} $text=$text。$ tmp$ size=MCRYPT _ get _ block _ size(MCRYPT _ RIJNDAEL _ 128,MCRYPT _ MODE _ CBC);$ module=MCRYPT _ module _ open(MCRYPT _ RIJNDAEL _ 128 ' ',MCRYPT _ MODE _ CBC ' ');mcrypt_generic_init($module,$key,$ iv);$ encrypted=MC rypt _ generic($ module,$ text);MC rypt _ generic _ definit($ module);MC rypt _ module _ close($ module);$ encrypt _ msg=base64 _ encode($ encrypted);返回$ encrypt _ msg}修改后的代码为:

?服务器端编程语言(Professional Hypertext Preprocessor的缩写)函数aes_encode($message,$encodingaeskey=' ',$ appid=' '){ $ key=base64 _ decode($ encoding AES key).'=');$text=random(16).pack('N ',strlen($message)).$消息$ appid$iv=substr($key,0,16);$ block _ size=32 $ text _ length=strlen($ text);$ amount _ to _ pad=$ block _ size-($ text _ length % $ block _ size);if($ amount _ to _ pad==0){ $ amount _ to _ pad=$ block _ size;} $ pad _ chr=chr($ amount _ to _ pad);$ tmp=for($ index=0;$ index $ amount _ to _ pad $ index){ $ tmp .=$ pad _ chr} $text=$text .$ tmp/* mcrypt对称加密代码在PHP7.1已经被抛弃了,所以使用下面的openssl来代替$ size=MCRYPT _ get _ block _ size(MCRYPT _ RIJNDAEL _ 128,MCRYPT _ MODE _ CBC);$ module=MCRYPT _ module _ open(MCRYPT _ RIJNDAEL _ 128 ' ',MCRYPT _ MODE _ CBC ' ');mcrypt_generic_init($module,$key,$ iv);$ encrypted=MC rypt _ generic($ module,$ text);MC rypt _ generic _ definit($ module);MC rypt _ module _ close($ module);*/$ encrypted=OPENSSL _ encrypt($ text,' AES-256-CBC ',$key,OPENSSL _ RAW _ DATA | OPENSSL _ ZERO _ PADDING,$ iv);$ encrypt _ msg=base64 _ encode($ encrypted);返回$ encrypt _ msg}特别注意:凡是涉及到微信开发的流程,如果已经升级到PHP 7.1的话,那么很有必要需要检查一下是否是使用Mcrypt对称加解密的,微信开发文档中使用的演示也是使用Mcrypt加解密的,这一点需要注意。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

更多资讯
游戏推荐
更多+