laravel 的 Auth 使用的是哪个 Hash 函数?

Posted

技术标签:

【中文标题】laravel 的 Auth 使用的是哪个 Hash 函数?【英文标题】:Which Hash function laravel's Auth is using? 【发布时间】:2014-09-23 10:59:24 【问题描述】:

我正在尝试使用 Laravel 的内置身份验证,但它不起作用。如果我在注册过程中散列密码,它与登录过程中的散列不匹配,因为 Laravel 的 auth 生成的散列与 Hash:make() 完全不同。

我做了一个测试路线和功能,让一切都清楚 (我尝试将 Auth::attempt() 函数与 Hash::make() 和没有 Hash::make() 一起使用,如果我传递哈希密码,它会生成一个完全不同的密码,如果我传递原始密码Auth 甚至懒得散列它):

Route::get('/test', function() 
    $email = rand(1, 1000) . "test@mail.com";
    $password = $email;
    $now = new DateTime();
    Felhasznalo::create(array(
        'teljesnev' => 'valami',
        'email' => $email,
        'jelszo' => Hash::make($password),
        'FelFelhasznaloiSzint_id' => 2,
        'created_at' => $now->getTimestamp(),
        'aktiv' => 1
    ));

    if (Auth::attempt(array(
                'email' => $email,
                'jelszo' => Hash:make($password)
            ))) 
        echo 'Working';
     else 
        echo 'Not working';
    
);

第一部分生成这一行到我的mysql服务器:

39test@mail.com, $2y$10$gkzQ2BEuDWN05RQ/OyBH8u4aKRqdL5zSIthUO4BUyEKcscgzRwZzG, valami ....etc

在尝试登录时,我故意将密码字段的名称输入错误 jelszo1(表示英文密码 1),以获取 sql 错误。

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'jelszo1' in 'where clause' (SQL: select * from `Felhasznalo` where `email` = 39test@mail.com and `jelszo1` = y$XAnnnGNKrOQOxBiX2BnEPOq86Y9mh5h./xwUlfCTPpzW.jzzt3YiO limit 1) 

第一部分(在mysql中):

$2y$10$gkzQ2BEuDWN05RQ/OyBH8u4aKRqdL5zSIthUO4BUyEKcscgzRwZzG

第二部分(尝试登录时):

y$XAnnnGNKrOQOxBiX2BnEPOq86Y9mh5h./xwUlfCTPpzW.jzzt3YiO

和用户模型(命名为 Felhasznalo)

<?php

use Illuminate\Auth\UserTrait;
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableTrait;
use Illuminate\Auth\Reminders\RemindableInterface;

class Felhasznalo extends \Eloquent implements UserInterface, RemindableInterface 

    use UserTrait,
        RemindableTrait;

    protected $fillable = [
        'id', 'email', 'jelszo', 'teljesnev', 'jelszoreset',
        'hash', 'aktiv', 'ban', 'FelFelhasznaloiSzint_id',
        'remember_token'
    ];
    protected $guarded = [
    ];
    protected $hidden = [
        'jelszo', 'jelszoreset', 'hash'
    ];
    protected $table = 'Felhasznalo';
    public $timestamps = true;
    protected $softDelete = true;

    //----------------------------
    //----------------------------
    // RELATIONSHIP FUNCTIONS
    //----------------------------
    //----------------------------

    /**
     * Get the unique identifier for the user.
     *
     * @return mixed
     */
    public function getAuthIdentifier() 
        return $this->getKey();
    

    /**
     * Get the password for the user.
     *
     * @return string
     */
    public function getAuthPassword() 
        return $this->jelszo;
    

    /**
     * Get the e-mail address where password reminders are sent.
     *
     * @return string
     */
    public function getReminderEmail() 
        return $this->email;
    

    public function getRememberToken() 
        return $this->remember_token;
    

    public function setRememberToken($value) 
        $this->remember_token = $value;
    

    public function getRememberTokenName() 
        return 'remember_token';
    


身份验证配置:

'model' => 'Felhasznalo',
'table' => 'Felhasznalo',

在尝试()中使用原始密码时出现 SQL 错误错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'jelszo1' in 'where clause' (SQL: select * from `Felhasznalo` where `email` = 832test@mail.com and `jelszo1` = 832test@mail.com limit 1) 

【问题讨论】:

【参考方案1】:

可以在mnshankar.wordpress.com - Laravel Hash::make() explained上找到帖子标题(laravel 的 Auth 使用的是哪个哈希函数?)中的问题的答案。

这是链接博客文章“How?”部分的第一句话:

在内部,Hash::make() 使用 bcrypt 函数和 Blowfish 算法进行加密。

另外,您可以在Laravel 5.4 docs - Hashing page 上看到他们说:

Laravel Hash 门面提供安全的 Bcrypt 散列来存储用户密码。

【讨论】:

【参考方案2】:

我刚刚检查了验证码,您的密码列必须称为password。你不能使用jelszo

另外 - 您的登录代码不正确。你只需这样做:

if (Auth::attempt(array(
                'email' => $email,
                'password' => $password
            ))) 
        echo 'Working';
     else 
        echo 'Not working';
    

Auth::attempt() 会为你做散列。

【讨论】:

我编辑了我的问题,它没有。如果我传入原始密码,它不会散列它。检查最后一部分。 是的。请参阅文档:laravel.com/docs/security#authenticating-users - 您的代码还有其他问题 我知道它应该,但它没有。 是的。谢谢你。但是为什么 getAuthPassword() 函数是用户模型的。这只是愚蠢的。

以上是关于laravel 的 Auth 使用的是哪个 Hash 函数?的主要内容,如果未能解决你的问题,请参考以下文章

laravel策略类,实现当前登陆的用户是否具有删除,修改文章的权限

Laravel 5 Auth 活跃成员

如何使用 Laravel 在响应正文中发送 auth cookie?

Laravel 加入 Auth 表

Laravel Auth0 未授权用户

Laravel最好的Auth捆绑包是什么? [关闭]