laravel 中使用 Hash::make() 对用户密码进行加密
2023-02-18 16:47:45 时间
laravel 中使用 Hash::make() 对用户密码进行加密
问题描述: 在调试中发现使用 Hash:make($password) 对用户密码进行加密;在验证时发现对于相同的password 会出现不同的加密结果,那么加密之后进行对比肯定是不相等的。
看了下实现方式: 使用Hash::check($password,$userInfo->password)
这种方式来对密码进行校验,不能使用Hash:make($password) == $userInfo->password
来进行判断。
先关代码如下:
<?php
namespace Illuminate\Support\Facades;
/**
* @method static array info(string $hashedValue)
* @method static bool check(string $value, string $hashedValue, array $options = [])
* @method static bool needsRehash(string $hashedValue, array $options = [])
* @method static string make(string $value, array $options = [])
*
* @see \Illuminate\Hashing\HashManager
*/
class Hash extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'hash';
}
}
看了下源码,发现该方法是使用 PHP 内置函数 password_hash() 来进行加密的。为什么使用 password_hash() 而不是用 md5() 呢?
因为 password_hash() 每次加密的结果都不相同,调用该方法会产生随机的 salt 值,这样加密后不容易产生碰撞,破解原始密码。那么password_verify() 是怎么检测密码是不是相等的呢,该加密过程是单向的,不可能是通过解密拿到原始密码来进行判断。(这样不符合安全规则,加密方式只能是单向的)。查看加密后的字符串,会发现有几个$,这就相当于定界符,字符串中包含了版本号,递归层数,salt 的值,知道这几个就可以通过相同的值来进行加密,然后进行判断。因为 salt 和递归层数都相同,所以加密后的值也是相同的。
相关文章
- Java基础系列(10)- 类型转换
- Java基础系列(8)- 数据类型
- Java基础系列(7)- 标识符和关键字
- Java基础系列(6)- 注释
- Java基础系列(5)- 使用IDEA开发
- Java基础系列(4)- 编译型和解释型
- Java基础系列(3)- HelloWorld详解
- Java基础系列(2)- Java开发环境搭建
- ☕【Java技术指南】「TestNG专题」单元测试框架之TestNG使用教程指南(下)
- ☕【Java技术指南】「TestNG专题」单元测试框架之TestNG使用教程指南(上)
- ☕【Java技术指南】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)
- 🏆【JVM技术专区】「编译技术专题」带你彻底认识Java的编译技术
- ☕【Java技术指南】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!
- ☕【Java技术指南】「Guava Collections」实战使用相关Guava不一般的集合框架
- ☕【Java技术指南】「并发原理专题」AQS的技术体系之CLH、MCS锁的原理及实现
- 【ShardingSphere技术专题】「ShardingJDBC」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式)
- 🏆【Java技术专区】「开发实战专题」Lombok插件开发实践必知必会操作!
- 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
- 🏆【Java技术专区】「延时队列专题」教你如何使用【精巧好用】的DelayQueue
- 🏆【Java技术专区】「探针Agent专题」Java Agent探针的技术介绍(1)