【问题标题】:Migrating users table with hashed password from old php app to new laravel app将带有哈希密码的用户表从旧的 php 应用程序迁移到新的 laravel 应用程序
【发布时间】:2013-11-13 14:03:54
【问题描述】:

我正在开发一个旧的 php 应用程序,用户的密码使用 md5() 函数进行哈希处理。所以密码的存储方式如下:

c0c92dd7cc524a1eb55ffeb8311dd73f

我正在使用 Laravel 4 开发一个新应用,我需要有关如何在不丢失密码字段的情况下迁移 users 表的建议。

【问题讨论】:

  • 丢失密码字段。你不应该继续使用 md5,也没有现实的方法可以将 md5 反转为纯文本,只是用 Laravel 的 bcrypt 再次重新散列。我会在您的网站上实现 Laravel 的密码重置/提醒功能,然后执行 foreach 并将每个用户的密码设置为随机密码。然后向您的所有用户发送一封电子邮件,要求他们重置密码。这样你就可以完全正确、安全地使用 Laravel。

标签: php hash laravel laravel-4


【解决方案1】:

尽可能快地丢失密码字段,但如果您不想冒失去用户的风险,您可以在您的身份验证方法上执行以下操作:

if (Auth::attempt(array('email' => Input::get('email'), 'password' => Input::get('password'))))
{
    return Redirect::intended('dashboard');
}
else
{
    $user = User::where('email', Input::get('email'))->first();

    if( $user && $user->password == md5(Input::get('password')) )
    {
        $user->password = Hash::make(Input::get('password'));

        $user->save();

        Auth::login($user->email);

        return Redirect::intended('dashboard');
    }

}

这基本上会在每次用户登录时将密码从 md5 更改为 Hash。

但您确实必须考虑向所有用户发送链接,以便他们更改密码。

编辑:

为了进一步提高安全性,根据@martinstoeckli的评论,最好是:

散列您当前的所有 md5 密码:

foreach(Users::all() as $user)
{
    $user->password = Hash::make($user->password);

    $user->save();
}

然后使用更简洁的方法更新您的密码:

$password = Input::get('password');
$email = Input::get('email');

if (Auth::attempt(array('email' => $email, 'password' => $password)))
{
    return Redirect::intended('dashboard');
}
else
if (Auth::attempt(array('email' => $email, 'password' => md5($password))))
{
    Auth::user()->password = Hash::make($password);

    Auth::user()->save();

    return Redirect::intended('dashboard');
}

【讨论】:

  • 所以基本上保留旧密码哈希并在第一次成功登录时重新哈希并更新数据库?在逐步淘汰之前,建议的保留期是多少?不能将旧的哈希值重新哈希到更强的算法,然后对输入进行双重哈希(在必要时用一些标志指示?)
  • 是的。仍然不是很安全,但比将它们永远保存在 md5 上要好,因为你不能只是转换它们。
  • @Anthony - 可以使用 BCrypt 散列不安全的 MD5 值,以提供即时保护。在这个answer 中,我试图展示这个过程。 MD5 最大的问题是它的速度,BCrypt 会减慢它的速度。当然,无论如何您都应该在成功登录后替换哈希。
  • 关于安全的好帖子和想法。刚刚更新了我的添加你的。谢谢。
  • 很好的逻辑,因为我试图做同样的事情,但我没有按照你的方式改变整个系统,因此它只需要 md5 哈希并决定危及安全性,但通过你的解决方案,我设法做到了为这段代码保存哈希安全 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 2021-03-15
  • 2016-01-15
  • 2018-11-11
相关资源
最近更新 更多