热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

PHP7.1废弃加密方法替换方案前瞻最近,我负责在重构项目的支付渠道,因为之前都是接一个渠道在ifelse的方式,代码显的比较混乱

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



推荐阅读
  • ICE(InternetCommunicationsEngine)是一个为现实中程序员而写的中间件平台。作为一个高性能的互联网通信平台,ICE包含了很多分层的服务和插 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 本文介绍了几种常用的图像相似度对比方法,包括直方图方法、图像模板匹配、PSNR峰值信噪比、SSIM结构相似性和感知哈希算法。每种方法都有其优缺点,适用于不同的应用场景。 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 本文深入解析了如何通过自定义 ViewGroup 实现类似支付宝风格的酷炫雷达脉冲动画效果。文章详细介绍了自定义 ViewGroup 的原理和实现步骤,并结合实际案例展示了如何在 Android UI 设计中应用这一技术,为开发者提供了宝贵的参考和实践指导。 ... [详细]
  • 在使用 PHP 通过 SSL 安全连接到 MySQLi 数据库服务器时,遇到了一些技术难题。我的环境包括一个 Web 服务器和一个数据库服务器,两者均使用 OpenSSL 生成了证书。尽管证书内容一致,但在尝试从 Web 服务器使用 `mysql` 命令进行连接时,仍然遇到了问题。为了确保连接的安全性和稳定性,需要进一步检查证书配置和 PHP 的 SSL 设置,以排除潜在的配置错误或兼容性问题。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 微信支付授权目录配置详解及操作步骤
    在使用微信支付时,若通过WeixinJSBridge.invoke方法调用支付功能,可能会遇到“当前页面URL未注册”的错误提示,导致get_brand_wcpay_request:fail调用微信JSAPI支付失败。为解决这一问题,需要正确配置微信支付授权目录,确保支付页面的URL已成功注册。本文将详细介绍微信支付授权目录的配置步骤和注意事项,帮助开发者顺利完成支付功能的集成与调试。 ... [详细]
  • 本文介绍了一种简化版的在线购物车系统,重点探讨了用户登录和购物流程的设计与实现。该系统通过优化界面交互和后端逻辑,提升了用户体验和操作便捷性。具体实现了用户注册、登录验证、商品浏览、加入购物车以及订单提交等功能,旨在为用户提供高效、流畅的购物体验。 ... [详细]
author-avatar
邵子轩一号
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有