概要:

php从7.0升级到7.1废弃了一个扩展,即mcrypt扩展,虽然安装上扩展也能正常使用,但是会发出警告,告诉我们mcrypt相关方法已经被废弃,到了7.2,已经被移除,因此不建议继续使用。

来源:

在使用微信,淘宝第三方开发文档的时候,很多地方还是沿用以前的加密方法,这个时候我们需要找到替换的方法,openssl就是不错的选择,这就需要我们清楚mcrypt和openssl之间的差异,以便保证数据加解密的一致性。

详解mcrypt和openssl来实现AES-128/192/256-CBC加解密:

一 要点注意:

1 使用何种填充算法。mcrypt自动使用NUL("\0"),openssl自动使用PKCS7

2 是否对数据做了base64编码处理。mcrypt默认不使用,openssl默认使用

二 算法演示

1 NUL("\0")填充算法

Mcrypt 的默认填充算法。NUL 即为 Ascii 表的编号为 0 的元素,即空元素,转移字符是 "\0",PHP 的 pack 打包函数在 'a' 模式下就是以 NUL 字符对内容进行填充的,当然,使用 "\0" 手动拼接也是可以的。

    /**
* NUL("\0")填充算法
* @param string $source
* @param string $cipher
* @param string $mode
* @return string
*/
public function addZeroPadding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC)
{
$source = trim($source);
// openssl 并没有提供加密cipher对应的数据块大小的api这点比较坑
$block = mcrypt_get_block_size($cipher, $mode);
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
// $source .= str_repeat("\0", $pad);//KISS写法
// pack 方法 a 模式使用 NUL("\0") 对内容进行填充 A 模式则使用空白字符填充
$source .= pack("a{$pad}", ""); //高端写法
}
return $source;
} /**
* NUL("\0")填充算法移除
* @param string $source
* @return string
*/
function stripZeroPadding($source)
{
return rtrim($source, "\0");
}

2 PKCS7 填充算法

OpenSSL的默认填充算法。下面我们给出 PKCS7 填充算法 PHP 的实现

    /**
* PKCS7填充算法
* @param string $source
* @param string $cipher
* @param string $mode
* @return string
*/
function addPKCS7Padding($source, $cipher = MCRYPT_RIJNDAEL_128, $mode = MCRYPT_MODE_CBC)
{
$source = trim($source);
$block = mcrypt_get_block_size($cipher, $mode);
$pad = $block - (strlen($source) % $block);
if ($pad <= $block) {
$char = chr($pad);
$source .= str_repeat($char, $pad);
}
return $source;
} /**
* 移去PKCS7填充算法
* @param string $source
* @return string
*/
function stripPKSC7Padding($source)
{
$source = trim($source);
$char = substr($source, -1);
$num = ord($char);
if ($num == 62) {
return $source;
} $source = substr($source, 0, -$num);
return $source;
}

涉及知识讲解:

1 AES详解:

AES是当前最为常用的安全对称加密算法

AES-128:16位密钥key

AES-192:24位密钥key

AES-256:32位密钥key

即算法统一使用MCRYPT_RIJNDAEL_128,并通过key的位数来选定是以何种AES标准加密,iv固定16位(openssl的AES加密iv始终为16位),mode选用CBC模式

2 openssl讲解:

openssl是一个功能强大的工具包,它集成了众多算法,我们既可以利用它提供的命令台工具生成密钥,证书来加解密文件,也可以利用其提供的API接口在代码中对传输信息进行加密。mctypt需要将加密算法分为cipher+mode去指定,openssl则只需要直接指定method即可。并且提供了三种处理模式,即默认模式0/OPENSSL_RAW_DATA/OPENSSL_ZERO_PADDING。

openssl加解密函数中,options参数尤为重要,它是兼容mcrypt算法的关键:

options = 0:默认模式,自动对明文进行pkcs7 padding,且数据做base64编码处理

options = 1:OPENSSL_RAW_DATA,自动对明文进行pkcs7 padding,数据未经base64编码处理

options = 2:OPENSSL_ZERO_PADDING,要求待加密的数据长度已按"\0"填充与加密算法数据块长度对齐,即同mcrypt默认填充的方式一致,且对数据做base64编码处理(此模式下openssl要求待加密数据已按"\0"填充好,其并不会自动帮你填充数据)。

案例详解:

mcrypt加密

private static $iv = “1122334455667788";

public static function encrypt($input, $key) {
$key = base64_decode($key);
$localIV = Security::$iv;
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);
mcrypt_generic_init($module, $key, $localIV);
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$pad = $size - (strlen($input) % $size);
$input . str_repeat(chr($pad), $pad);
$data = mcrypt_generic($module, $input); mcrypt_generic_deinit($module);
mcrypt_module_close($module);
$data = base64_encode($data);
return $data;
}

openssl解密

private $hex_iv = '0102030405060708';
private $key = ''; public function decrypt_($input)
{
$input = base64_decode($input);
$decrypted = openssl_decrypt(
$input,
'AES-128-CBC',
$this->key,
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,
$this->hex_iv
);
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
return $decrypted;
}

mcrypt相关函数详解:

mcrypt_module_open 打开加密算法和模式

参数1使用加密算法的名称,对应mcrypt_list_algorithms()输出的加密算法;参数3支持的加密模式,对应mcrypt_list_modes()输出的加密模式

mcrypt_generic_init 初始化加密缓冲区

参数1为返回的加密描述符,参数2为加密密钥,参数3为初始化向量

mcrypt_get_block_size 取得编码方式的区块大小

参数1为加密算法,参数3为加密模式

mcrypt_generic 数据加密

参数1为返回的加密描述符,参数2为加密钱的数据,返回加密后字符串

mcrypt_generic_deinit 结束加密,执行清理工作

mcrypt_module_close 关闭资源退出

以上就是这次的全部内容

php7废弃mcrypt加密,使用openssl替换的更多相关文章

  1. PHP7.1中使用openssl替换mcrypt

    PHP7.1中使用openssl替换mcrypt 在php开发中,使用mcrypt相关函数可以很方便地进行AES加.解密操作,但是PHP7.1中废弃了mcrypt扩展,所以必需寻找另一种实现.在迁移手 ...

  2. PHP的Mcrypt加密扩展知识了解

    今天我们来学习的是 PHP 中的一个过时的扩展 Mcrypt .在 PHP7 之前,这个扩展是随 PHP 安装包一起内置发布的,但是现在新版本的 PHP 中已经没有了,需要使用这个扩展的话我们需要单独 ...

  3. 使用php mcrypt加密解密

    数字签名:对数据和私钥进行hash运算得到消息摘要,连同消息本身一块发给客户端.数据签名强调客户端接收到的数据是来自特定服务端,服务端具有对数据不可否认性.客户端通过确认此次签名的正确性来判断拿到的消 ...

  4. net-snmp源码VS2013编译添加加密支持(OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  5. net-snmp源码VS2013编译添加加密支持(OpenSSL)(在VS里配置编译OpenSSL)

    net-snmp源码VS2013编译添加加密支持(OpenSSL) snmp v3 协议使用了基于用户的安全模型,具有认证和加密两个模块. 认证使用的算法是一般的消息摘要算法,例如MD5/SHA等.这 ...

  6. 【转帖】互联网加密及OpenSSL介绍和简单使用

    转帖:https://mritd.me/2016/07/02/%E4%BA%92%E8%81%94%E7%BD%91%E5%8A%A0%E5%AF%86%E5%8F%8AOpenSSL%E4%BB%8 ...

  7. 小程序 mcrypt加密拓展在php7.1 废弃 使用openssl替代方案

    原加密方法 使用mcrypt //获得16位随机字符串,填充到明文之前 $random = $this->getRandomStr(); $text = $random . pack(" ...

  8. PHP7.* AES的加密解密

    之前写过一篇: PHP AES的加密解密-----[弃用] 使用的是php5.*之前的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,上马的是openssl的openssl_en ...

  9. PHP mcrypt加密扩展使用总结

    在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密.PHP中有提供了mcrypt的这样一个加密扩展实现对数据的加密解密. 一.mcrypt扩展的安装 在低版本的PHP中需要在配置文件 ...

随机推荐

  1. 记录常见的问题:encodeURICompnent 解码过程中出现空格 以及 第三方app中使用schema 唤起app

    window.location.href 跳转的时候使用了encodeURIComponent编码了部分参数,但是在第三方app中出现了编码过后的参数换行和空格的情况(部分第三方应用或者java程序) ...

  2. Antd组件Table树型多选全选问题

    组件库antd里面的树型选择不能做到勾选父组件然后一起勾选子组件情况,我也不知道是组件库的问题还是原本设计就是这样 刚好组件库存在rowselection的配置项,既然存在拓展方法,又遇到需求,那么就 ...

  3. element ui图片上传方法

    <!--商品图片--> <template v-slot:product_cover> <el-upload list-type="picture-card&q ...

  4. 交换机基本原理与VRP基础及操作

    交换机基本原理与VRP基础及操作 目录 交换机基本原理与VRP基础及操作 一.数据链路层 1.数据链路层的位置 2.数据链路层的功能 二.以太网(Ethernet) 1.以太网的概念 2.MAC地址( ...

  5. 基于Hexo的博客管理恢复

    若重装电脑或更换电脑后 该如何恢复博客的管理? 1.确保之前博客源代码文件夹及文件保存在公库或私库中 例如: 我这里采用的是闭源存放方案,故为私库 这是源码文件样式 2.在新电脑上重新安装git,no ...

  6. 浅谈Java之反射

    反射 四种获取Class实例的方法 定义测试结构 获取属性结构 获取方法结构 获取构造器结构(包括父类泛型) 获取实现的接口 获取所在包 获取注解 获取并创建指定构造器 获取指定属性 获取并运行指定方 ...

  7. 从服务间的一次调用分析整个springcloud的调用过程(二)

    先看示例代码 @RestController @RequestMapping("/students") public class StudentController { @Auto ...

  8. opencv笔记-GFTTDetector

    在 "光流跟踪" 中,使用了 Harris 角点作为 LK 光流跟踪输入点.角点定义为在两个方向上均有较大梯度变化的小区域,使用自相关函数描述. 自相关函数为为图像平移前后某一个区 ...

  9. [LeetCode]66.加一(Java)

    原题地址: plus-one 题目描述: 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字. 你可以假设除了整数 ...

  10. JavaScript函数式编程(纯函数、柯里化以及组合函数)

    JavaScript函数式编程(纯函数.柯里化以及组合函数) 前言 函数式编程(Functional Programming),又称为泛函编程,是一种编程范式.早在很久以前就提出了函数式编程这个概念了 ...