前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel 中使用 Hash::make() 对用户密码进行加密

laravel 中使用 Hash::make() 对用户密码进行加密

作者头像
句小芒
发布2022-12-29 18:09:43
1.3K0
发布2022-12-29 18:09:43
举报

laravel 中使用 Hash::make() 对用户密码进行加密

问题描述: 在调试中发现使用 Hash:make($password) 对用户密码进行加密;在验证时发现对于相同的password 会出现不同的加密结果,那么加密之后进行对比肯定是不相等的。

看了下实现方式: 使用Hash::check($password,$userInfo->password)

这种方式来对密码进行校验,不能使用Hash:make($password) == $userInfo->password来进行判断。

先关代码如下:

代码语言:javascript
复制
<?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 和递归层数都相同,所以加密后的值也是相同的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档