在Laravel中批量更新密码

时间:2014-10-22 14:36:25

标签: php laravel-4

我看了很多质量任务问题,但似乎没有一个问题可以解决我的问题。我正在处理一个遗留系统,其中存储了大约350k个明文密码。我正在为Laravel 4重新设计系统,所以我需要在所有这些条目上使用Laravel的密码散列系统。我试过了:

$users = User::where(DB::raw('length(password)'), '<', 60)->get();
foreach($users as $user)
{
    $user->password = Hash::make($user->password);
    $user->save();
}

哪个有效,但是花了很多时间,而且我不想等待几天来更新所有这些记录。 (DB是远程的,因此在通信中会有很多额外的延迟时间。)

我希望我可以按照以下方式做点什么:

DB::table('users')->where(DB::raw('length(password)'), '<', 60)
    ->update(['password'=>????]);

根据Laravel文档,这看起来像我使用的语法,但我不知道我会怎么做????一部分。

非常感谢任何帮助! -Eric

3 个答案:

答案 0 :(得分:2)

你必须遍历它们 - 没有其他办法。您需要为每个明文密码计算唯一的盐渍哈希值。

它花费了大量时间的原因&#34;因为Hashing的计算成本很高。您没有注意到1-2个哈希值。但你会得到350k哈希。

它像比特币采矿 - 除了你这次没有得到报酬。

编辑:同样 - 如果用户 的密码长度> 60,则明确文字&#39;在您的旧系统中 - 如果您计划使用Laravel Auth系统,您仍然必须将这些散列为60长度散列 - 因为它会在将密码与数据库进行比较时自动散列密码。

答案 1 :(得分:1)

回答一个老问题,但刚刚遇到几乎相同的问题。

为了没有三天的停机时间,我最终做的是:

  1. 暂时拥有一个密码为明文的密码_tmp列
  2. 使用我自己的LegacyUserProvider扩展EloquentUserProvider并替换validateCredentials方法
  3. 如果用户登录且其密码列为空,则会针对password_tmp测试密码。如果这是正确的,它会记录用户,然后散列并保存密码
  4. 在后台,我有一组正在运行的队列,并使用空密码列抓取用户并散列密码_tmp
  5. 几天后,当所有旧密码被替换后,删除password_tmp

答案 2 :(得分:0)

Laravel使用bcrypt进行散列。 bcrypt专门设计为缓慢作为安全措施 - 它可以防止攻击者通过快速尝试数百万或数十亿个密码来强制登录,直到找到匹配为止。