在开发中,很多时候我们在前后端交互中需要对一些敏感数据进行一定的加密。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. 解决C#导出excel异常来自 HRESULT:0x800A03EC的方法 .

    解决C#导出excel异常来自 HRESULT:0x800A03EC的方法 .   xlBook.SaveAs(FilePath,Microsoft.Office.Interop.Excel.XlFi ...

  2. System.Data.Dbtype转换为System.Data.SqlDbType

    最近在做一些OM Mapping的准备工作,新学了一招. 如果要将System.Data.Dbtype转换为System.Data.SqlDbType,以前以为要写Switch Case语句.其实有很 ...

  3. IOS中把字符串加密/IOS中怎么样MD5加密/IOS中NSString分类的实现

    看完过后,你会学到: 1学习IOS开发中的分类实现, 2以及类方法的书写, 3以及字符串的MD5加密/解密. ---------------------------wolfhous---------- ...

  4. IOS开发-本地持久化存储sqlite应用

    前言 需求描述 开发测试环境 FMDB介绍 创建工程 一.前言 上一章介绍了如何开发一个IOS应用的入门案例教程:                     我的第一个IOS开发应用    本章主要将介 ...

  5. Profile 分析 Erlang 虚拟机源码时要注意的一个问题

    最近用 Intel Vtune 剖析 Erlang 虚拟机的运行,想看看那些函数和语句耗时最多,遇到一个小问题,那就是 Vtune 给出的源码和汇编码对应有问题.这个问题在 profile 或 deb ...

  6. Effective Java 66 Synchronize access to shared mutable data

    synchronized - Only a single thread can execute a method or block at one time. Not only does synchro ...

  7. 浅谈 sql 中数据的约束

    数据约束 --对用户操作表的数据进行约束 1.默认值 --当用户对使用默认值的字段不插入值的时候,就使用默认值 1)对默认值字段插入null是可以的. 2)对默认值字段可以插入非null [例如:ad ...

  8. Moodle插件之Filters(过滤器)

    Moodle插件之Filters(过滤器) 过滤器是一种在输出之前自动转换内容的方法. 目的: 创建名为helloworld的过滤器,实现将预输出的“world”字符串替换成“hello world” ...

  9. JavaScript中的不可见数据类型

    JS提供了一些内置对象.函数和构造器供我们编程,如Math.parseInt.Object.Array等.这些都是可见的,编程时可以使用的.比如我可以new Object 或 new Array. 有 ...

  10. iTOP-4412开发板低功耗高性能的开源硬件平台——上手评测

    iTOP-4412开发板现在比较热门的开发板,笔者近期入了一套.也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超 ...