加密300万条记录的最快方式

时间:2017-07-07 17:14:44

标签: php csv bcrypt

我们已经继承了一个拥有300万用户登录的系统,这个系统以CSV格式分成500k块,并且没有使用密码。

客户反对建议,已经决定他想保留相同的密码,但只是为新系统哈希,而不是强迫用户设置新密码,所以请不要回复说"只是不要这样做&#34 ;

我们目前正在使用PHP处理文件以规范化数据并加密现有字符串。

然而,在200条记录上运行测试时,我们将bcrypt添加到循环中的过程中,该过程需要大约7秒的时间。

随着时间的推移,这显然会大大增加。

有没有人有其他建议如何以更快的速度将字符串转换为bcrypt?我想也许有一个命令行工具,我们可以将CSV传递给它,它知道第4列和第34列;是密码,然后哈希,然后保存回文件或其他东西。

欢迎提出任何建议。

值得一提的是,我们需要在发布日重复此过程,因此需要最少的停机时间吗?

非常感谢

更新

对于那些感兴趣的人,在2012 MBP上使用2.6Ghz i7和8GB内存时,花了9个小时来完成第一轮运行6个脚本实例,每个实例处理500k用户。

2 个答案:

答案 0 :(得分:4)

嗯,bcrypt很慢的事实很重要 - 它应该很慢,使它更能抵抗蛮力破解。

我能想到的只有几个选项:

  1. 分配任务并使用更多线程/处理器/计算机。

  2. 使用较低的"复杂度"因子。这会使散列更快,但有点降低散列的安全性,所以不是一个很好的选择。

  3. 至于在发布日使流程运行得更快以避免停机,这就是我的建议:

    1. 现在Bcrypt所有250万个帐户,并使用用户帐户将bcrypt哈希存储在新系统中。

    2. 此外,计算密码的简单SHA哈希值,并使用关联的用户ID将其存储在脱机文件中。

    3. 在上线日,从旧系统中再次获取所有帐户。对于在步骤1之后创建的新帐户,使用Bcrypt哈希在新系统中创建帐户。对于其他帐户,请检查SHA哈希(快速计算)是否与您在步骤2中创建的文件中的SHA哈希匹配。如果不匹配,请重新加密密码并更新新系统。如果匹配,则无需再次进行密码。

答案 1 :(得分:2)

为CSV添加新字段PasswordHash。在发布日,所有客户都是空的。对于过渡期,身份验证代码会根据明文密码针对散列密码检查用户凭据。在接下来的几小时/几天/周内,后台进程会散列所有密码并删除普通密码。