Laravel的加密解密与哈希实例讲解


Posted in PHP onMarch 24, 2021

一、加密解密

当你的应用程序中需要用到加密和解密的地方时可以使用Laravel自带的加密解密工具。

Laravel 的加密机制使用的是 OpenSSL 所提供的 AES-256 和 AES-128 加密。强烈建议你使用 Laravel 内建的加密工具,而不是用其它的加密算法。所有 Laravel 加密之后的结果都会使用消息认证码 (MAC) 签名,使其底层值不能在加密后再次修改。

相应的配置文件 config/app.php

首先生成 APP_KEY

php artisan key:generate

在.env文件里面

APP_KEY=base64:NHs1dJd5AkOZJvnPJEHMVmg89hi7Lr8Uc5zkOXEgMgk=

最终调用的地方在:

Illuminate\Encryption\Encrypter.php
 
public function decrypt($payload, $unserialize = true)
public function decrypt($payload, $unserialize = true)

可以看出,默认是支持序列化和反序列化的,也就是说支持对数组和对象进行加密解密。

再来看我们可以调用的方法:
助手函数:helpers.php

function encrypt($value, $serialize = true)
{
  return app('encrypter')->encrypt($value, $serialize);
}
function decrypt($value, $unserialize = true)
{
  return app('encrypter')->decrypt($value, $unserialize);
}

门面操作:Illuminate\Support\Facades\Crypt

public function encryptString($value)
{
  return $this->encrypt($value, false);
}
public function decryptString($payload)
{
  return $this->decrypt($payload, false);
}

可以看出门面是只能对字符串进行加密解密的,而助手函数功能更强大一些。

示例:

$pass = "123456";
$this->info($pass);
 
$this->info("");
 
$enc = Crypt::encryptString($pass);
$this->info($enc);
 
$dec = Crypt::decryptString($enc);
$this->info($dec);
 
$this->info("");
 
$enc = encrypt($pass);
$this->info($enc);
$dec = decrypt($enc);
$this->info($dec);

二、哈希加密

哈希加密应用在不需要解密的地方,比如存储密码,校验密码。
Bcrypt 是哈希密码的理想选择,因为它的 「加密系数」 可以任意调整,这意味着生成哈希所需的时间可以随着硬件功率的增加而增加。
配置:config/hashing.php
使用门面:Illuminate\Support\Facades\Hash
加密:

$pass = "123456";
$enc = Hash::make($pass);
// $2y$10$4A6vnjdJwIo.FjnvcPN4OepeFgiJ4K1VDCXRSGUbjue3k23AID3Pq
// $2y$10$JhFPyb7nEN6A9.P5ZHXYpea07E727LNbxhMj8UrsuoE0M1PKUYY9i

同一个字符串每次加密的结果不一样!!

校验:

if (Hash::check($pass, $enc)) {
  $this->info("ok");
}else{
  $this->info('err');
}

即使每次加密的结果不一样,但是不影响校验。

PHP 相关文章推荐
PHP中调用JAVA
Oct 09 PHP
PHP中路径问题的解决方案
Oct 09 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
php天翼开放平台短信发送接口实现方法
Dec 22 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
Laravel程序架构设计思路之使用动作类
Jun 07 PHP
在Laravel5.6中使用Swoole的协程数据库查询
Jun 15 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 PHP
laravel使用redis队列实例讲解
phpquery中文手册
Mar 18 #PHP
thinkphp5 路由分发原理
Mar 18 #PHP
is_file和file_exists效率比较
Mar 14 #PHP
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
open_basedir restriction in effect. 原因与解决方法
Mar 14 #PHP
aec加密 php_php aes加密解密类(兼容php5、php7)
Mar 14 #PHP
You might like
PHP新手上路(十)
2006/10/09 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
php微信公众号js-sdk开发应用
2016/11/28 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
关于JS数组追加数组采用push.apply的问题
2014/06/09 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
Django自定义认证方式用法示例
2017/06/23 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
Python 列表中的修改、添加和删除元素的实现
2020/06/11 Python
如何利用Python 进行边缘检测
2020/10/14 Python
html5 datalist标签使用示例(自动完成组件)
2014/05/04 HTML / CSS
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
校园自助餐厅的创业计划书
2013/12/26 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
倡议书格式及范文
2015/04/29 职场文书
2015年质检工作总结
2015/05/04 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
狂人日记读书笔记
2015/06/30 职场文书
教学工作总结范文5篇
2019/08/19 职场文书
导游词之包公祠
2019/11/25 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL