在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密。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为解密后的明文。

最新文章

  1. .NET Core采用的全新配置系统[2]: 配置模型设计详解
  2. [Leetcode] Decode Ways
  3. 两个平行div之间有间隙
  4. sqlserver2012 表分区
  5. GTP (GPRS隧道协议(GPRSTunnellingProtocol))
  6. 利用NTFS权限与虚拟目录,在IIS 6.0的默认FTP站点中做用户隔离。
  7. OC基础(21)
  8. 如何用正则将多个空格看成一个空格结合spllit()方法将文本数据入库
  9. js中常用的日期总结
  10. Python之子进程subprocess模块
  11. sb error
  12. SpringBoot开发案例之拦截器注入Bean
  13. Nginx三部曲(1)基础
  14. unidbgrid单元格操作
  15. java park unpark
  16. Unknown type name &#39;NSString&#39;
  17. HDU 4489 The King’s Ups and Downs dp
  18. 小数据池,bytes
  19. Android 命令行模拟按键
  20. ES6 学习笔记 (1)

热门文章

  1. Android 在外部存储读写文件
  2. 【读书笔记】iOS-写代码注意事项
  3. 自定义组件 -- android联系人
  4. iOS开发笔记9:NSUserDefaults存储自定义实体对象
  5. Cocos2d入门--3--向量的应用
  6. 去除UITableView中多余的分割线或者隐藏cell间的分割线
  7. android 进程间通信---bind的前世
  8. Android中有时候运行程序的时候会报错:An internal error occurred during:。。。。
  9. C++中的多态与虚函数的内部实现
  10. Spring-2-B Save the Students(SPOJ AMR11B)解题报告及测试数据