PHP mcrypt加密扩展使用总结
在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密。PHP中有提供了mcrypt的这样一个加密扩展实现对数据的加密解密。
一、mcrypt扩展的安装
在低版本的PHP中需要在配置文件php.ini中显式添加对扩展的引用,同时要保证扩展引用目录中有相应的扩展文件;在高版本的PHP中,Windows下似乎默认开启了mcrypt的扩展,既不需要在配置文件php.ini中做配置,在扩展引用目录中也没有看到相应的扩展文件,在linux下则需要安装对应的mcrypt.so扩展。

mcrypt扩展支持多种加密算法和模式,可以使用mcrypt_list_algorithms()和mcrypt_list_modes()来显示支持的加密算法和加密模式。

二、mcrypt扩展的使用
加密
1、打开加密算法和模式
mcrypt_module_open('tripledes', '', ecb'', '');
第一个参数是使用的加密算法的名称,对应mcrypt_list_algorithms()输出的加密算法;第三个参数对应加密的模式,对应mcrypt_list_modes()输出的支持加密模式。
2、创建初始化向量
mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
PS.在Window平台下,第二个参数固定使用MCRYPT_RAND
3、初始化加密缓冲区
mcrypt_generic_init($td, $key, $iv);
$td为返回的加密描述符,$key为加密密钥,$iv为初始化向量
4、数据加密
$encrypted_data = mcrypt_generic($td, $data);
$td为加密描述符,$data为加密前的数据,数据加密函数返回加密后的字符串。
5、结束加密,执行清理工作
mcrypt_generic_deinit($td);
解密
1、打开解密算法和模式,同上,得到$td解密描述符
2、创建初始化向量,同上,得到$iv初始化向量
3、初始化解密缓冲区
mcrypt_generic_init($td,$key, $iv);
4、数据解密
$decrypted_data = mdecrypt_generic($td, $encrypted_data);
PS.$encrypted_data为解密前的密文,$decrypted_data为解密后的明文。
演示Demo:
<?php
/* 打开加密算法和模式 */
$td = mcrypt_module_open('rijndael-256', '', 'ofb', ''); /* 创建初始向量,并且检测密钥长度。
* Windows 平台请使用 MCRYPT_RAND。 */
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM);
$ks = mcrypt_enc_get_key_size($td); /* 创建密钥 */
$key = substr(md5('very secret key'), 0, $ks); /* 初始化加密 */
mcrypt_generic_init($td, $key, $iv); /* 加密数据 */
$encrypted = mcrypt_generic($td, 'This is very important data'); /* 结束加密,执行清理工作 */
mcrypt_generic_deinit($td); /* 初始化解密模块 */
mcrypt_generic_init($td, $key, $iv); /* 解密数据 */
$decrypted = mdecrypt_generic($td, $encrypted); /* 结束解密,执行清理工作,并且关闭模块 */
mcrypt_generic_deinit($td);
mcrypt_module_close($td); /* 显示文本 */
echo trim($decrypted) . "\n";
?>
三、实现一个AES加密类
<?php
/**
* PHP AES加密解密类
* Created by PhpStorm.
* User: ahao
* Date: 2016/11/3
* Time: 0:03
*/
class PubEncrypt{
public static $key = '123454536f667445454d537973576562'; // 默认的key /**
* AES加密
* @param $data 明文
* @param null $key 加密密钥
* @return array|string
*/
public static function AesEncrypt($data, $key = null){
$data = trim($data);
if($data == '') return '';
try{
if(!extension_loaded('mcrypt'))
throw new Exception('当前PHP环境没有加载mcrypt扩展'); // 打开加密算法和模式
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); $key = self::substr($key == null ? self::$key : $key, 0, mcrypt_enc_get_key_size($module));
$iv = substr(md5($key), 0, mcrypt_enc_get_iv_size($module)); // 初始化加密
mcrypt_generic_init($module, $key, $iv); // 加密数据
$encrypt = mcrypt_generic($module, $data); // 反初始化释放资源
mcrypt_generic_deinit($module); // 关闭资源对象退出
mcrypt_module_close($module);
return array('status' => true, 'data' => base64_encode($encrypt));
}catch (Exception $e){
$error = $e->getMessage();
$data = array(
'status' => false,
'msg' => $error
);
return $data;
}
} /**
* AES解密
* @param $encrypted 密文
* @param null $key 解密密钥
* @return array|string
*/
public static function AesDecrypt($encrypted, $key = null){
$encrypted = trim($encrypted);
if($encrypted == '') return '';
try{
if(!extension_loaded('mcrypt'))
throw new Exception('当前PHP环境没有加载mcrypt扩展'); $encrypted = base64_decode($encrypted);
$module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); $key = self::substr($key == null ? self::$key : $key, 0, mcrypt_enc_get_key_size($module));
$iv = substr(md5($key), 0, mcrypt_enc_get_iv_size($module)); mcrypt_generic_init($module, $key, $iv);
$decrypted = mdecrypt_generic($module, $encrypted);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
return array('status' => true, 'data' => rtrim($decrypted,"\0"));
}catch (Exception $e){
$error = $e->getMessage();
$data = array(
'status' => false,
'msg' => $error
);
return $data;
}
} /**
* 截取字符串
* @param $string 被截取的字符串
* @param $start 起始位置
* @param $length 截取长度
* @return string 截取到的字符串
*/
private static function substr($string, $start, $length)
{
return extension_loaded('mbstring') ? mb_substr($string,$start,$length,'8bit') : substr($string,$start,$length);
}
}
PS.使用数据加密的好处:数据在前后台之间进行传输的是一个加密后的字符串,可以防止数据被爬虫抓包,避免敏感数据的泄露,也可以有效防止猜测出数据项对数据操作接口进行恶意请求
一、mcrypt扩展的使用
加密
1、打开加密算法和模式
mcrypt_module_open('tripledes', '', ecb'', '');
第一个参数是使用的加密算法的名称,对应mcrypt_list_algorithms()输出的加密算法;第三个参数对应加密的模式,对应mcrypt_list_modes()输出的支持加密模式。
2、创建初始化向量
mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
PS.在Window平台下,第二个参数固定使用MCRYPT_RAND
3、初始化加密缓冲区
mcrypt_generic_init($td, $key, $iv);
$td为返回的加密描述符,$key为加密密钥,$iv为初始化向量
4、数据加密
$encrypted_data = mcrypt_generic($td, $data);
$td为加密描述符,$data为加密前的数据,数据加密函数返回加密后的字符串。
5、结束加密,执行清理工作
mcrypt_generic_deinit($td);
解密
1、打开解密算法和模式,同上,得到$td解密描述符
2、创建初始化向量,同上,得到$iv初始化向量
3、初始化解密缓冲区
mcrypt_generic_init($td,$key, $iv);
4、数据解密
$decrypted_data = mdecrypt_generic($td, $encrypted_data);
PS.$encrypted_data为解密前的密文,$decrypted_data为解密后的明文。
PHP mcrypt加密扩展使用总结的更多相关文章
- PHP的Mcrypt加密扩展知识了解
今天我们来学习的是 PHP 中的一个过时的扩展 Mcrypt .在 PHP7 之前,这个扩展是随 PHP 安装包一起内置发布的,但是现在新版本的 PHP 中已经没有了,需要使用这个扩展的话我们需要单独 ...
- PHP openssl加密扩展使用总结
1.检查服务器是否已安装了openssl组件,没有则先安装好 openssl version [-a] 2.对称加密 查询openssl支持的对称加密算法 openssl_get_cipher_met ...
- mcrypt加密以及解密过程
Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示 Mcrypt扩展库可以实现加密解密功能 ...
- 使用php mcrypt加密解密
数字签名:对数据和私钥进行hash运算得到消息摘要,连同消息本身一块发给客户端.数据签名强调客户端接收到的数据是来自特定服务端,服务端具有对数据不可否认性.客户端通过确认此次签名的正确性来判断拿到的消 ...
- php7废弃mcrypt加密,使用openssl替换
概要: php从7.0升级到7.1废弃了一个扩展,即mcrypt扩展,虽然安装上扩展也能正常使用,但是会发出警告,告诉我们mcrypt相关方法已经被废弃,到了7.2,已经被移除,因此不建议继续使用. ...
- PHP的openssl加密扩展使用小结
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- PHP安装sodium加密扩展
1.为什么会用到sodium加密扩展? 最近在做微信服务商相关的开发,主要用的的接口为微信小微商户进件接口.在请求相关接口中,需要对一些敏感字段进行加密,加密过程见https://pay.weixin ...
- PHP的OpenSSL加密扩展学习(一):对称加密
我们已经学过不少 PHP 中加密扩展相关的内容了.而今天开始,我们要学习的则是重点中的重点,那就是 OpenSSL 加密扩展的使用.为什么说它是重点中的重点呢?一是 OpenSSL 是目前 PHP 甚 ...
- PHP手册-函数参考-加密扩展
一.Crack.CSPRNG.Hash.Mcrypt.Mhash.OpenSSL.密码散列算法的对比 Crack CSPRNG Hash Mcrypt Mhash OpenSSL 密码散列算法 简 ...
随机推荐
- eclipse一直卡住,出现 “android sdk content loader 0%” 卡住的错误分析及解决方法
分析:这种问题之前没有遇到过,也不知道什么原因,直接去网上查询,打开www.stackoverflow.com,输入要查询问题的关键词,我们输入 “android sdk content loader ...
- IOS之未解问题--关于IOS图像渲染CPU和GPU
前言:先上一个图.关于UIKit底层渲染机制,这个有待以后花大把时间收集资料和学习,然后汇总,将整篇"未解问题"去除. 反思:半个月前阿里电话面试,问道一个问题图像渲染什么时候回用 ...
- 【转】初识CGI
一.基本原理 CGI:通用网关接口(Common Gateway Interface)是一个Web服务器主机提供信息服务的标准接口.通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器 ...
- android之apk反编译
今天就来详细的讲一讲apk的反编译过程,之前自己一直没彻底搞清楚. 一.准备工作 反编译首先要准备三个工具.这三个工具都是可以百度下载的.就是下图所示的三个工具. 这三个工具是有各自作用的: (1)a ...
- ISO9126软件质量模型
ISO9126软件质量模型,是评价软件质量的国际标准.6个特性27个子特性组成. ISO/IEC9126软件质量模型是一种评价软件质量的通用模型,包括3个层次: 1.质量特性 2.质量子特性 3.度量 ...
- Python基本数据结构-元组
- GDI学习之俄罗斯方块
做个玩玩 public Form1() { InitializeComponent(); } #region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行 pr ...
- Web Application Project is configured to use IIS. Unable to access the IIS metabase.(配置为使用IIS Web应用程序xxxx项目。无法访问IIS元数据库。)
这几天重装系统,装了win10,居然用vs2013打开项目出现下面这个提示错误,搞了很久才知道原因: Even though I am an administrator on the machine, ...
- MySQL忘记密码,或:root密码重置报错:mysqladmin: connect to server at 'localhost' failed的解决方案
MySQL root密码重置报错:mysqladmin: connect to server at 'localhost' failed的解决方案 1 登陆失败,mysqladmin修改密码失败 ...
- 烂泥:ubuntu安装KVM虚拟机管理virt-manager
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 打算学习KVM的图形界面管理器virt-manager,但是virt-manager只有linux系统的,没有windows下的.所以只能使用linux ...