在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密。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加密扩展使用总结的更多相关文章

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

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

  2. PHP openssl加密扩展使用总结

    1.检查服务器是否已安装了openssl组件,没有则先安装好 openssl version [-a] 2.对称加密 查询openssl支持的对称加密算法 openssl_get_cipher_met ...

  3. mcrypt加密以及解密过程

    Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示 Mcrypt扩展库可以实现加密解密功能 ...

  4. 使用php mcrypt加密解密

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

  5. php7废弃mcrypt加密,使用openssl替换

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

  6. PHP的openssl加密扩展使用小结

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  7. PHP安装sodium加密扩展

    1.为什么会用到sodium加密扩展? 最近在做微信服务商相关的开发,主要用的的接口为微信小微商户进件接口.在请求相关接口中,需要对一些敏感字段进行加密,加密过程见https://pay.weixin ...

  8. PHP的OpenSSL加密扩展学习(一):对称加密

    我们已经学过不少 PHP 中加密扩展相关的内容了.而今天开始,我们要学习的则是重点中的重点,那就是 OpenSSL 加密扩展的使用.为什么说它是重点中的重点呢?一是 OpenSSL 是目前 PHP 甚 ...

  9. PHP手册-函数参考-加密扩展

    一.Crack.CSPRNG.Hash.Mcrypt.Mhash.OpenSSL.密码散列算法的对比   Crack CSPRNG Hash Mcrypt Mhash OpenSSL 密码散列算法 简 ...

随机推荐

  1. 使用一般处理程序HTTPHandler下载文件

    一般来说我们可以用HTTPHandler来处理一些简单的逻辑,比如验证码.下载文件等. 以下载word文档为例讲解一下如何在HHTPHandler中下载文件,不限于word文档,如果下载其他文件,需要 ...

  2. adb 的相关操作及遇到的问题

    一. 电脑连接你的手机 1.打开手机的开发者模式 并  开启调试工具 2.用手机连接上  你的电脑 3.在eclipse 中的DDMS 中查看是否 连接到 如图所示: 这时会发现 多了一个连接 :说明 ...

  3. Hibernate学习0.Hibernate入门

    Hibernate是什么 面向java环境的对象/关系数据库映射工具. 1.开源的持久层框架. 2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据 ...

  4. ios NSURLSession(iOS7后,取代NSURLConnection)使用说明及后台工作流程分析

    NSURLSession是iOS7中新的网络接口,它与咱们熟悉的NSURLConnection是并列的.在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作.注意, ...

  5. Swift之map函数的强大之处

    CollectionType Map 在CollectionType的extension中map方法的定义: extension CollectionType { /// Return an `Arr ...

  6. nginx 与 lua 开发环境搭建

    首先下载最新版的 相关软件 的安装文件. nginx: http://nginx.org/en/download.html LuaJIT: http://luajit.org/download.htm ...

  7. 读书笔记——Windows环境下32位汇编语言程序设计(3)一些基础知识

    声明函数用proto 定义函数用proc 局部变量只能定义,不能赋初值,类型不能用缩写. 全局变量可以定义的时候赋初值,默认值为0. 在invoke中,参数可以使用addr取址. sizeof 字节长 ...

  8. 复制文件的bat脚本

    数据库备份到不同的机器上的一段脚本 使用系统的copy 命令来复制单个文件 如果要复制某个文件夹,则使用xcopy 命令 set date=%Date:~0,4%%Date:~5,2%%Date:~8 ...

  9. ZOJ 3865 Superbot(优先队列--模板)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5477 主要思路:1.从一个点(cur)到它相邻的点(next),所需 ...

  10. 常用的Linux可插拔认证模块(PAM)应用举例(一)

    pam_access.so模块 pam_access.so模块主要的功能和作用是根据主机名(包括普通主机名或者FQDN).IP地址和用户实现全面的访问控制.pam_access.so模块的具体工作行为 ...