加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP 7.1中操作OpenSSL取代Mcrypt加解密的要领详解

发布时间:2021-03-14 17:02:38 所属栏目:编程 来源:网络整理
导读:提纲: php7.1宣布后新特征吸引了不少PHPer,各人都在接头新特征带来的甜头与便利。可是从php7.0 进级到 php7.1 废弃(过期)了一个在已往广泛应用的扩展(mcrypt扩展)。官方提供了响应的办理提醒,却没有提供更具体的办理步伐。于是坑来了: 本日在行使微信开

提纲:

php7.1宣布后新特征吸引了不少PHPer,各人都在接头新特征带来的甜头与便利。可是从php7.0 进级到 php7.1 废弃(过期)了一个在已往广泛应用的扩展(mcrypt扩展)。官方提供了响应的办理提醒,却没有提供更具体的办理步伐。于是坑来了:

本日在行使微信开放平台对接一个内容打点体系的时辰,在绑定公家号的时辰一向失败

缘故起因:

调试的时辰发明,直接缘故起因是由于开放平台内里填写的授权变乱(该授权变乱每异常钟会通送一次变乱来更新ticket),即:

PHP 7.1中操作OpenSSL取代Mcrypt加解密的要领详解

这个处所填写的url,调试发明,这个URL没错,微信也有每10分钟推送过来,可是到最后一向吸取不到ticket,看代码发明是由于解密微信过来的数据的时辰报错了:

function aes_decode($message,$encodingaeskey = '',$appid = '') {
$key = base64_decode($encodingaeskey . '=');

$ciphertext_dec = base64_decode($message);
$iv = substr($key,16);

$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,'');
mcrypt_generic_init($module,$key,$iv);
$decrypted = mdecrypt_generic($module,$ciphertext_dec);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);

$pad = ord(substr($decrypted,-1));
if ($pad < 1 || $pad > 32) {
$pad = 0;
}

即这个处所,因为我的情形是PHP 7.1,查找资料发明PHP 7.1已经废弃了Mcrypt,以是这个代码内里的mcrypt_*都是无法运行的。

办理:

查找资料发明,可以通过OpenSSL来取代Mcrypt(条件是已经安装了OpenSSL扩展,不外一样平常都是默认安装的)

openssl是一个成果强盛的器材包,它集成了浩瀚暗码算法及适用器材。我们即可以操作它提供的呼吁台器材天生密钥、证书来加密解密文件,也可以在操作其提供的API接口在代码中对传输信息举办加密。

以是上面的代码可以改为:

function aes_decode($message,16);

/ mcrypt对称解密代码在PHP7.1已经被丢弃了,以是行使下面的openssl来取代
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128,$ciphertext_dec);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
/
$decrypted = openssl_decrypt($ciphertext_dec,'AES-256-CBC',OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING,$iv);

$pad = ord(substr($decrypted,-1));
if ($pad < 1 || $pad > 32) {
$pad = 0;
}

增补:

上面的解密已经修改了,那么对应的Mcrypt加密也必要修改,假如不改的话会导致不能全网宣布以及不能推送动静等变乱 加密的源代码如下:

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,$iv);
$encrypted = mcrypt_generic($module,$text);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);

$encrypt_msg = base64_encode($encrypted);
return $encrypt_msg;
}

修改后的代码为:

$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,$text);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
/

$encrypted = openssl_encrypt($text,$iv);
$encrypt_msg = base64_encode($encrypted);
return $encrypt_msg;
}

出格留意:往往涉及到微信开拓的流程,假如已经进级到PHP 7.1的话,那么很有须要必要搜查一下是否是行使Mcrypt对称加解密的,微信开拓文档中行使的demo也是行使Mcrypt加解密的,这一点必要留意。

总结

以上就是这篇文章的所有内容了,但愿本文的内容对各人的进修可能事变具有必然的参考进修代价,假若有疑问各人可以留言交换,感谢各人对编程之家的支持。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读