当前位置: 首页 > 后端技术 > PHP

PHP7.1废弃加密方式替换解决方案

时间:2023-03-29 15:09:19 PHP

PHP7.1废弃加密方式替换前景最近负责重构项目的支付通道,因为之前是用ifelse的方式接入一个通道,代码是相当混乱。正好整个项目都在做微服务,所以我们决定把支付做成微服务,分离出来。目前流行的支付渠道,如支付宝、微信等,开展支付业务的时间都比较早,文档或整个支付方案也比较成熟。之前的比较顺利。但是,我们也连接到了京东金融。可能京东金融支付比较晚,文档肯定没有前两者好。最糟糕的是京东提供的工具类中的加密方法使用了mcrypt_encrypt,所以问题就来了。首先我们看一下PHP官网的备注。mcrypt_encrypt(PHP4>=4.0.2,PHP5,PHP7)mcrypt_encrypt—使用给定参数加密明文请注意,下面有一个爆炸点:警告从PHP7.1.0开始,此函数已被弃用。依赖这个函数是Highlydiscouraged.stringmcrypt_encrypt(string$cipher,string$key,string$data,string$mode[,string$iv])什么?不再支持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;Alternatives貌似没有官方的替代方案,但是我们其实在很多场景下都在使用一种加密方式。即openssl,我们使用openssl_encrypt。我们来看看官方吧。openssl_encrypt(PHP5>=5.3.0,PHP7)openssl_encrypt—加密数据说明:使用指定的方法和密钥对数据进行加密,并返回原始或base64编码的字符串。stringopenssl_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);什么?一行代码就搞定了?是的,没错,一行代码搞定。但是openssl_encrypt加密会根据加密方式进行加密,然后进行base64加密,哈哈哈,所以需要解密base64_decode($data);现在已经完成加密,可以进行京东支付了。解密也是一样,加密和解密必须是同步的。由于官方不支持这种加密方式,当然7.1也放弃了解密方式。mdecrypt_genericmdecrypt_generic(PHP4>=4.0.2,PHP5,PHP7)mdecrypt_generic—解密数据字符串mdecrypt_generic(resource$td,string$data)解密数据。请注意,由于数据填充,返回字符串的长度可能不等于明文的长度。警告从PHP7.1.0开始,此函数已被弃用。强烈建议不要依赖此函数。$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_decryptopenssl_decrypt(PHP5>=5.3.0,PHP7)openssl_decrypt—解密数据说明字符串openssl_decrypt(string$data,string$method,string$key[,int$options=0[,string$iv=""[,string$tag=""[,string$aad=""]]]])采用原始或base64编码字符串并使用给定的方法和密钥对其进行解密。解密替代方案:$decrypted=openssl_decrypt($encrypted,'des-ede3',$key,OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);//解密同就是一行代码,这还需要更多的操作。也是base64(sao词)的后记。其实对于openssl_encrypt和mcrypt_encrypt,openssl_encrypt支持的加密方式更多。开头说了,希望在大版本更换的时候把这些淘汰掉,因为这样会引起更多的关注,在小版本迭代的时候就不会引起那么多的关注了。所以即使你因为版本的原因没有遇到这个问题,也希望你在使用的时候可以更换一下。openssl支持比较全面,目前有很多版本。参考资料php.net:http://php.net/manual/zh/ref....wiki:https://wiki.openssl.org/inde...