Laravel中encrypt与decrypt的实现方法详解
这篇文章主要给大家介绍了关于Laravel中encrypt和decrypt的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
前言
Laravel 的加密机制使用 OpenSSL 提供 AES-256 和 AES-128 的加密,本文将详细介绍关于Laravel中encrypt和decrypt的实现,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
1. 使用方法
首先是生成秘钥。要需要在.env目录里提供APP_KEY,这个如果没有的话,可以通过命令php artisan key:generate
生成,也可以自己设置。生成后例子应该是这样的
1 |
|
在文件配置加密key和加密算法,在config/app.php的目录里有配置
1 2 3 |
|
使用方法,在laravel里已经有使用方法了,这里就不在过多的说了。主要使用的两个方法,一个是encrypt的加密,一个是decrypt的解密
2. 查找加密解密的文件
实现方法的位置是在vendor/illuminate/encryption/的目录下发现两个文件,一个是EncryptionServiceProvider另外一个是Encrypter
3. 分析EncryptionServiceProvider文件
1 2 3 4 5 6 7 8 9 10 11 12 |
|
这个文件没太多东西,但是通过这个我们可以看出,其实在配置文件的,我们能直接写key,并且前面不带base64也是可以解析。相当于省几步操作
另外,在实例化类的时候,需要传入key以及加密方式
4. 分析Encrypter文件
1. 分析__construct,在实例化之前执行
1 2 3 4 5 6 7 8 9 10 11 |
|
上面的方法,主要是用来判断加密方式和传的key的长度是否相同,因为不同的加密方式,要求的相应的key的长度也是有要求的,具体每种加密方式要求key的长度可以查找对应的文档
1 2 3 4 5 6 7 |
|
上面这个方法展现了一个严谨的地方,用了mb_strlen方法,并且要求计算长度是按照8bit位来计算的。这样的好处是,不管是在哪种操作系统,计算的长度都是一样的。
通过这个考虑到不同操作系统的情况,不会出现加密出现问题的情况。
2. 分析encrypt方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
上面用到了一个自定义的方法hash(),我们可以看下方法的实现。
1 2 3 4 5 6 7 |
|
以上加密共分了三大步
1、生成随机码
2、生成加密内容
3、生成签名
框架用到一个优雅的方法,使用serialize生成一个值,这个方法高雅在哪里,就是不管你得内容是数组还是字符串,都能转换成字符串。 而使用serialize和使用json_encode的区别在哪,我想最大的好处是,你所要加密的内容比较大的时候,serialize相对于要快。
另外一个地方是,框架在加密的时候使用了一个随机字符串。为什么要使用随机字符串呢,因为使用了随机字符串,使每次加密的内容都是不一样的,防止别人猜出来。
3. 分析decrypt方法
解密数据,可以说是最复杂的一块,不仅要进行数据的解密,而且还要保证数据的完整性,以及数据防篡改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
getJsonPayload方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
validPayload方法就不说了,比较简单和基本,重点就说说validMac验证这块,保证数据不被篡改,这是最重要的
1 2 3 4 5 6 7 8 |
|
calculateMac方法是为了根据原始数据和随机值生成一个签名,然后用这签名再次生成一个签名
1 2 3 4 5 6 |
|
以上解密共分了三大步
1、判断数据的完整性
2、判断数据的一致性
3、解密数据内容。
这个验证签名有个奇怪的地方,他并不像我们平常验证签名一样。我们平常验证签名都是,拿原始数据和随机值生成一个签名,然后拿生成的签名和原始数据的签名进行比对来判断是否有被篡改。
而框架却多了一个,他用的是,通过原始数据和随机值生成签名后,又拿这个签名生成了一个签名,而要比对的也是拿原始数据里的签名在生成一个签名,然后进行比对。目前想不出,为什么要多几步操作。
在加密的时候,我们把原始数据使用serialize转换了一下,所以我们相应的也需要使用unserialize把数据转换回来。
注意
加密时使用的openssl_encrypt里的随机项量值是使用的原始数据raw这种二进制的值,使用openssl_decrypt解密后的值是使用的经过base64位后的随机字符串。
解密的时候生成签名比较的时候,不是用原来的签名,然后根据原始数据的内容,重新生成一次签名进行比较,而是使用原始签名为基础生成一个签名,然后在拿原始数据为基础生成的签名,在用这个新生成的签名重新生成了一次签名。然后进行比较的。
AES256是加密数据,后面能够逆向在进行解密出数据。而SHA256是生成签名的,这个过程是不可逆的,是为了验证数据的完整性。
源链接:http://www.php.cn/php-weizijiaocheng-379388.html
Laravel中encrypt与decrypt的实现方法详解相关推荐
- python中的class怎么用_对python 中class与变量的使用方法详解
python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...
- object类中的equals与自定义equals方法详解
object类中的equals与自定义equal方法详解 1.this怎么理解?this == obj表示什么? this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,ob ...
- php 修改 wordpress,修改WordPress中文章编辑器的样式的方法详解
这篇文章主要介绍了修改WordPress中文章编辑器的样式的方法详解,同时文中也推荐了两款取代默认文章编辑器的插件,需要的朋友可以参考下 自定义文章编辑器的样式每一个 WordPress 主题的文章样 ...
- python中class变量_对python 中class与变量的使用方法详解
python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...
- pythonbool类型数组生成_对numpy中布尔型数组的处理方法详解
布尔数组的操作方式主要有两种,any用于查看数组中是否有True的值,而all则用于查看数组是否全都是True. 如果用于计算的时候,布尔量会被转换成1和0,True转换成1,False转换成0.通过 ...
- java n%9==0_用C++实现求N!中末尾0的个数的方法详解
题目描述: 输入一个正整数n,求n!(即阶乘)末尾有多少个0? 比如: n = 10; n! = 3628800,所以答案为2 输入描述: 输入为1行,n(1≤n≤1000) 输出描述: 输出一个整数 ...
- 站长在线Python精讲:在Python中匹配字符串的3个方法详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中匹配字符串的3个方法详解>.本知识点主要内容有:使用match()方法进行匹配.使用search()方法进行 ...
- 站长在线Python精讲:在Python中格式化字符串的两种方法详解
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...
- pdo mysql fetchall_PDO中获取结果集之fetchAll()方法详解
fetchAll()方法是获取结果集中的所有行,返回一个包含结果集中所有行的二进制数组!大理石机械构件维修厂家 那么在上一篇<PDO中获取结果集之fetch()方法详解>中,我们介绍了fe ...
最新文章
- JAVA vs C++之速度—
- JavaWeb常用的操作
- 比较两组数据的差异用什么图更直观_芯片数据分析中常见的一些图的作用
- 让AI打工!搜狗全体员工于3月12日狗胜节放假一天
- layui循环遍历数据_layui.laytpl渲染模板,遍历、输出、判断
- 用VB实现网页下载跟踪程序
- Java面试必问的HashMap,基础mysql笔试题及答案
- 启动Hadoop都哪些进程?它们的作用是什么
- 老马 Markov 其人
- 试题 算法训练 翻转旋转变换
- 同时安装 TensorflowPytorch
- 百度刚刚晋升的29岁最年轻副总裁李明远
- LVS负载均衡集群服务搭建详解
- letcode第319场周赛
- 我回来了,“纵使日薄西山”
- 《工程学导论》读书笔记第二章工程与科学
- 微信小程序开发(未完待续)
- python运用实例视频_Python实例教学
- 剑指offer笔记(九)栈和队列
- 搞懂网线的水晶头超5类和6类的区别