【问题标题】:Manually hashing plaintext passwords in database always returns false with Hash::check在数据库中手动散列明文密码总是使用 Hash::check 返回 false
【发布时间】:2019-10-25 01:10:32
【问题描述】:

我正在将一个站点迁移到 laravel 框架中,旧站点的数据库将用户密码存储为明文。显然这是个问题,所以我使用this code 对密码进行哈希处理。客户还要求用户能够通过他们的用户名登录,所以我编辑了默认登录控制器来解决这个问题。创建一个新帐户并登录它可以正常工作,但尝试登录现有帐户总是返回无效凭据。

我从php artisan make:auth 开始,并从那里编辑了生成的文件。

我尝试在迁移中以及在 php artisan tinker 中对密码进行哈希处理。我也尝试在迁移和修补程序中使用$user->password = Hash::make($user->password); 而不是$user->password = bcrypt($user->password);。我每次尝试登录时都得到相同的结果。

如果我在 artisan tinker 中使用 Hash::make,然后 Hash::check 针对创建的哈希和明文密码,它会返回 true,但是当我尝试使用这些凭据登录时,它会失败。 bcrypt 为 Hash::check in tinker 返回 false。使用 bcrypt 为 Hash::needsRehash 返回 true,而 Hash::make 返回 false。

用户名设置为唯一的。

用户模型:

protected $primaryKey = 'user_id';

protected $fillable = [
    'username', 'password',
];

protected $guarded = [];

protected $hidden = [
    'password', 'remember_token',
];

public function getAuthPassword()
{
    return $this->password;
}

登录控制器:

use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
    $this->middleware('guest')->except('logout');
}
public function username()
{
    return 'username';
}

login.blade 用户名/密码表单字段:

<div class="form-group row">
    <label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Username') }}</label>
    <div class="col-md-6">
        <input id="username" type="text" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autofocus>
            @error('username')
            <span class="invalid-feedback" role="alert">
                <strong>{{ $message }}</strong>
            </span>
            @enderror
    </div>
</div>
<div class="form-group row">
    <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
    <div class="col-md-6">
        <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
        @error('password')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
        @enderror
    </div>
</div>

我希望能够登录现有帐户,但当我尝试(使用原始数据库的备份检查密码)时,我收到一个典型的“这些凭据与我们的记录不匹配”。用户输入错误密码会收到错误。

【问题讨论】:

  • 问题出在您最初的密码没有散列!
  • 我向您保证,将密码存储为纯文本不是我的决定!这个数据库太旧了。关于如何解决这个问题的任何见解?
  • 老我的意思是十多年前。我只是必须让它发挥作用的可怜的笨蛋。
  • 试试这个让我们看看它是否有效。获取其中一个明文密码和 bcrypt(password) 它。然后尝试使用它登录。
  • 我已经尝试过了,但是在再次查看它的过程中,我发现了我的问题!在某些时候,我在数据库中的密码字段被更改为 20 的长度,因此没有保存完整的密码哈希。哎呀!

标签: php laravel hash


【解决方案1】:

我发现了我的问题。在某些时候,我的密码字段长度更改为 20,而不是 250。显然这是截断哈希。哎呀!认为这是我错过的一些愚蠢的事情。

【讨论】:

    猜你喜欢
    • 2019-08-15
    • 2014-02-25
    • 2021-06-05
    • 2020-02-14
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2019-03-14
    相关资源
    最近更新 更多