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

数据加密:对数据进行加密,有对称加密和非对称加密两种。PHP中常使用 mcrypt和openssl扩展对数据进行加解密。mcrypt常用在对称加密中,openssl常用在非对称加密中。另外在编程中还经常使用到一种单项散列加密算法,比如MD5,HASH,SHA1,password_hash等对数据(通常是用户密码)进行加密,这种加密是不可解密的(理论上没有不可解密的算法,只是说解密的机器耗时较长便认为不可解密。一般情况下仍然可采用暴力字典破解和查找彩虹表的方式破解),hash单向加密一般会有个盐值。

在实际应用场景中,有只使用数据签名然后明文传输数据的(这是最多的),也有使用数据签名和加密数据进行传输的,一半很少只有数据加密而没有数据签名的情况吧。、

MCRYPT加密

首先明确这几个概念

算法名称:即 MCRYPT扩展所支持的密码算法,详细列表可参见mcrypt.c文件。mcypt支持的算法见文末。

算法模式:MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。

算法模块:使用mcrypt_module_open()打开的指定算法和模式对应的模块,是一个资源类型

初始向量:加密时需要用到的一个参数,使用mcrypt_create_iv()从随机源创建

初始向量大小:是指由mcrypt_get_iv_size()返回的指定算法/模式组合的初始向量大小。mcrypt_create_iv()根据初始向量大小创建初始向量。

mcrypt加密解密需要以下几个步骤

加密:

1 使用mcrypt_module_open()打开指定算法和模式的对应模块。

2 mcrypt_get_iv_size()获得指定算法和模式的初始向量长度,或mcrypt_enc_get_iv_size($td)获取打开模块的初始向量长度。

3 根据初始向量长度创建初始向量 mcrypt_create_iv()

4 初始化加密所需的缓冲区 mcrypt_generic_init()

5 加密数据 mcrypt_generic()

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

解密需要以下几个步骤

1 初始化解密模块 mcrypt_generic_init()

2 解密数据 mcrypt_decrypt()

3 结束解密,执行清理工作 mcrypt_generic_deinit()

4 关闭开始时打开的模块 mcrypt_module_close

整个加解密的过程类似创建图片的过程,首先创建画布资源,创建颜色,填充,最后image_destroy一样。

然后来看一下上面提到的几个函数的用法

1.mcrypt_module_open — 打开算法和模式对应的模块

resource mcrypt_module_open ( string $algorithm , string $algorithm_directory , string $mode , string $mode_directory )

返回资源类型

参数说明见表 1-1

表1-1

参数 说明
algorithm MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称。见文末
algorithm_directory algorithm_directory 参数指示加密模块的位置。 如果你提供此参数,则使用你指定的值。 如果将此参数设置为空字符串(""),将使用 php.ini 中的 mcrypt.algorithms_dir 。 如果不指定此参数,则使用 libmcrypt 的编译路径 (通常是 /usr/local/lib/libmcrypt)。
mode MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。
mode_directory algorithm_directory 参数指示加密模式的位置。 如果你提供此参数,则使用你指定的值。 如果将此参数设置为空字符串(""),将使用 php.ini 中的 mcrypt.modes_dir 。 如果不指定此参数,则使用 libmcrypt 的编译路径 (通常是 /usr/local/lib/libmcrypt)。

2.mcrypt_get_iv_size — 返回指定算法/模式组合的初始向量大小

int mcrypt_get_iv_size ( string $cipher , string $mode )

返回初始向量大小

可使用mcrypt_enc_get_iv_size($td) 代替,$td可以是由 mcrypt_module_open() 返回的资源作为参数。

参数说明见表 1-2

表1-2

参数 说明
cipher MCRYPT_ciphername 常量中的一个,或者是字符串值的算法名称。
mode MCRYPT_MODE_modename 常量中的一个,或以下字符串中的一个:"ecb","cbc","cfb","ofb","nofb" 和 "stream"。

3.mcrypt_create_iv — 从随机源创建初始向量

string mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] )

返回初始向量

表1-3

参数 说明
size 初始向量大小。可由mcrypt_get_iv_size或mcrypt_enc_get_iv_size获得
source 初始向量数据来源。可选值有: MCRYPT_RAND (系统随机数生成器), MCRYPT_DEV_RANDOM (从 /dev/random 文件读取数据) 和 MCRYPT_DEV_URANDOM (从 /dev/urandom 文件读取数据)。 在 Windows 平台,PHP 5.3.0 之前的版本中,仅支持 MCRYPT_RAND。

4.mcrypt_generic_init — 初始化加密所需的缓冲区

int mcrypt_generic_init ( resource $td , string $key , string $iv )

如果发生错误,将会返回负数: -3 表示密钥长度有误,-4 表示内存分配失败, 其他值表示未知错误, 同时会显示对应的警告信息。 如果传入参数不正确,返回 FALSE。

表1-4

参数 说明
td 加密描述符。由mcrypt_module_open获得的资源类型
key 调用 mcrypt_enc_get_key_size() 函数获得的密钥最大长度。 小于最大长度的数值都被视为非法参数。
iv 通常情况下,向量大小等于算法的分组大小, 但是你应该通过 mcrypt_enc_get_iv_size() 函数 来获得这个值。在 ECB 模式下,初始向量会被忽略, 在 CFB,CBC,STREAM,nOFB 和 OFB 模式下,必须提供初始向量。 初始向量要求是随机的,并且是唯一的(不需要是安全的)。 加密和解密必须使用相同的初始向量。 如果你不想使用初始向量,请将其设置为全 0 值,但是不建议你这么做。

5.mcrypt_generic — 加密数据

string mcrypt_generic ( resource $td , string $data )

返回加密后的数据

表1-5

参数 说明
td 加密描述符。由mcrypt_module_open获得的资源类型
data 要加密的数据

6.mdecrypt_generic — 解密数据

string mdecrypt_generic ( resource $td , string $data )

返回解密后的字符串

请注意,由于存在数据补齐的情况, 返回字符串的长度可能和明文的长度不相等

参数 td 加密描述符。由mcrypt_module_open获得的资源类型,data是需要解密的密文

6.mcrypt_generic_deinit — 对加密模块进行清理工作

bool mcrypt_generic_deinit ( resource $td )

参数 td 加密描述符。由mcrypt_module_open获得的资源类型

本函数终止由加密描述符(td)指定的加密模块, 它会清理缓冲区,但是并不关闭模块。 要想关闭加密模块, 你需要自行调用 mcrypt_module_close() 函数。 (但是 PHP 会在脚本末尾为你关闭已打开的加密模块)

7.mcrypt_module_close — 关闭加密模块

bool mcrypt_module_close ( resource $td )

参数 td 加密描述符。由mcrypt_module_open获得的资源类型

下面一个例子说明加解密过程

class McryptModel{protected $td = '';protected $iv = '';protected $key = '';private static $instance = NULL;private function __construct($cipher,$mode,$key) {$this->cipher = $cipher;$this->mode = $mode;$this->key = $key;}public static function getInstance($cipher=MCRYPT_RIJNDAEL_128,$mode=MCRYPT_MODE_CBC,$key='H5gOs1ZshKZ6WikN') {if (self::$instance == NULL) {self::$instance = new self($cipher,$mode,$key);}return self::$instance;}function encrypt($str) {$td = mcrypt_module_open($this->cipher,'',$this->mode,'');//打开算法模块$this->td = $td;$iv_size = mcrypt_enc_get_iv_size($td);// 获取向量大小$iv = mcrypt_create_iv($iv_size,MCRYPT_RAND);//初始化向量$this->iv = $iv;$num = mcrypt_generic_init($td,$this->key,$iv);//初始化加密空间//var_dump($num);$encypt = mcrypt_generic($td,$str);//执行加密mcrypt_generic_deinit($td); // 结束加密,执行清理工作return base64_encode($encypt);//base64编码成字符串适合数据传输}function decyrpt($str) {$str = base64_decode($str);$td = $this->td;mcrypt_generic_init($td,$this->key,$this->iv);$decrypt = mdecrypt_generic($td,$str);mcrypt_generic_deinit($td);mcrypt_module_close($td);//关闭算法模块return $decrypt;}
}$m = McryptModel::getInstance();
echo $s = $m->encrypt('hello'); // 输出 4cnqrVkCjcr5unW0ySUdWg==
echo $m->decyrpt($e);  // 输出 hello

mcrypt加解密属于对称加密,算法是公开的,其安全性是来自对秘钥的保密。用户可选择不同的算法名称和算法模式。常用的算法是MCRYPT_RIJNDAEL_128,MCRYPT_DES,rijndael-256等,常用的模式是 cbc,ecb

php中支持的算法如下:

  • MCRYPT_3DES

  • MCRYPT_ARCFOUR_IV ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_ARCFOUR ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_BLOWFISH

  • MCRYPT_CAST_128

  • MCRYPT_CAST_256

  • MCRYPT_CRYPT

  • MCRYPT_DES

  • MCRYPT_DES_COMPAT ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_ENIGMA ( 仅 libmcrypt > 2.4.x 可用,MCRYPT_CRYPT 的别名)

  • MCRYPT_GOST

  • MCRYPT_IDEA (非免费算法)

  • MCRYPT_LOKI97 ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_MARS ( 仅 libmcrypt > 2.4.x 可用,非免费算法)

  • MCRYPT_PANAMA ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RIJNDAEL_128 ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RIJNDAEL_192 ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RIJNDAEL_256 ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RC2

  • MCRYPT_RC4 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_RC6 ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_RC6_128 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_RC6_192 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_RC6_256 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SAFER64

  • MCRYPT_SAFER128

  • MCRYPT_SAFERPLUS ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_SERPENT( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_SERPENT_128 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SERPENT_192 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SERPENT_256 ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_SKIPJACK ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_TEAN ( 仅 libmcrypt 2.2.x 可用 )

  • MCRYPT_THREEWAY

  • MCRYPT_TRIPLEDES ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_TWOFISH ( mcrypt 2.x 之前的版本,或者 2.4.x 之后版本可用 )

  • MCRYPT_TWOFISH128 (TWOFISHxxx 在新的 2.x 版本可用,但在 2.4.x 版本不可用)

  • MCRYPT_TWOFISH192

  • MCRYPT_TWOFISH256

  • MCRYPT_WAKE ( 仅 libmcrypt > 2.4.x 可用 )

  • MCRYPT_XTEA ( 仅 libmcrypt > 2.4.x 可用 )

使用php mcrypt加密解密相关推荐

  1. mcrypt加密解密

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

  2. php在线解密mcrypt,PHP 基于 Mcrypt 的加密解密简单类

    最近的一个项目项目中需要对 Cookie 加密,所以使用到了 Mcrypt 的方法进行加密解密的工作,于是我就整理成一个简单的类,以后直接简单调用类实现即可. Mcrypt 介绍 Mcrypt 是 P ...

  3. mcrypt php 加密解密,mcrypt启用 加密以及解密过程详细解析

    Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原. 1.PHP加密扩展库Mcrypt安装在标准的PHP安装过程中并没有把Mrcypt安装上,但PHP的主目录下包含了libmc ...

  4. mcrypt php 加密解密,PHP mcrypt启用、加密以及解密过程详解

    Mcrypt扩展库可以实现加密解密功能,就是既能将明文加密,也可以密文还原. 1.安装PHP加密扩展Mcrypt 要使用该扩展,必须首先安装mcrypt标准类库,注意的是mcrypt软件依赖libmc ...

  5. php mcrypt_rand,php基于mcrypt的加密解密实例

    本文实例讲述了php基于mcrypt实现加密解密的方法.分享给大家供大家参考.具体实现方法如下: PHP中自带了相当多的加密的方法,这里我们来看一下mcrypt扩展的使用方式.也是在工作中需要用这个东 ...

  6. php实现cookie加密解密

    1.加密解密类 1 class Mcrypt 2 { 3 /** 4 * 解密 5 * 6 * @param string $encryptedText 已加密字符串 7 * @param strin ...

  7. Go加密解密之DES

    一.DES简介 DES(Data Encryption Standard)是对称加密算法,也就是加密和解密用相同的密钥.其入口参数有三个:key.data.mode.key为加密解密使用的密钥,dat ...

  8. PHP7.2中AES加密解密方法mcrypt_module_open()替换方案

    直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...

  9. mcrypt拓展_PHP mcrypt加密扩展使用总结

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

最新文章

  1. python输入函数后无法运行_python - 如何在函数运行期间忽略所有用户输入?_python_酷徒编程知识库...
  2. Keycloak Spring Security适配器的常用配置
  3. SQL必知必会-数据插入
  4. 自主巡航——高精度地图制作
  5. 利用通用权限管理系统底层解决数据从不同库的导入导出问题
  6. java list 之详解_java集合(二)List集合之ArrayList详解
  7. 使用JMH做Java微基准测试(二)Hello2020!
  8. 计算机基础与应用演示文稿教案,计算机应用基础教案82修饰演示文稿.pdf
  9. SSL安全证书:免费的SSL证书申请渠道有哪些?
  10. 回顾2022,展望2023,笔耕不辍,钟情翰墨
  11. javax.faces.FacesException: Unable to find CDI BeanManager的解决方法
  12. 解决google打开以后跳转到hao123
  13. originos和鸿蒙系统的区别,originos是什么系统_originos和安卓有什么区别
  14. 后台开发语言的比较 java php python asp.net ruby on rails
  15. python 爬取财经新闻_金融财经新闻的文本爬取
  16. 嵌入式linux开发视频下载
  17. 超370亿美元资金布局NFT市场
  18. 宏碁ES1-433笔记本BIOS无法更改启动项解决办法
  19. UCF Local Programming Contest Round 1A记录
  20. 全民直播答题爆红,平台烧钱混战能火多久

热门文章

  1. 日语助词て的所有的语法点,请牢记
  2. k8s pod 详解
  3. 3dmax常用快捷键来了!!
  4. 3V至17V TPS53312RGTR 采用QFN封装 1A降压转换器
  5. 对数组排序(选择法)
  6. 人人商城前期下单,系统首单为复购
  7. 短消息聊天框html模板,短信、私信、微信等聊天对话的文本消息生成器AE模板
  8. unity桌面 linux,天啊,Ubuntu14.04 unity桌面还要不要人用?
  9. 【菜鸟教程】Zookeeper基础入门(使用curator)【下】
  10. java中虚数咋表示,虚数的定义(高中虚数i的运算公式举例)