将sha1转换为bcrypt?

Say*_*jee 6 php passwords sha1 bcrypt

我有一个PHP应用程序,有一个相当不错的用户群.现在不幸的是,这些年来它一直在使用sha1($ password.$ salt),我真的想放弃支持bcrypt.我找到了一些获得Blowfish哈希的好方法,但我仍然不确定我应该使用的转换方法.以下是我的选择:

选项1

每次用户登录时,我都会检查哈希是否以$ 2开头.如果没有,我认为它是sha1,取用户输入的密码,获取它的bcrypt哈希并替换数据库中的旧哈希.

选项2

我替换我的auth类来执行此操作:

$hash = password_hash("rasmuslerdorf", sha1($password . $salt));
Run Code Online (Sandbox Code Playgroud)

这样,转换更快.

但老实说,我真的不喜欢这两种选择.两者都表明我仍然在代码库中保留遗留检查,我想摆脱它.

从编码标准的角度来看,上述哪两个更好?或者有人有更好的解决方案吗?

mar*_*kli 2

每个密码存储系统都必须可以选择切换到更好的哈希算法,您的问题并不像您想象的那样是一次性迁移问题。像 BCrypt 这样的好的密码哈希算法有一个成本因素,你必须不时地增加这个成本因素(因为更快的硬件),然后你需要与迁移所需的相同的过程。

您的选项1是一种方便的方法,只要散列不是非常不安全(未加盐或非常弱的算法)。在 PHP 的新密码 API中,您甚至可以使用函数password_needs_rehash()来确定是否需要更新。

我建议让后备保留在代码中,这样您的客户就可以免去向用户提供无效密码的麻烦。作为用户,我不喜欢要求单击链接并重新输入密码的电子邮件,用户被教导要忽略此类电子邮件,因为网络钓鱼。如前所述,代码中的此类回退并不坏,这是获得安全密码处理的必要步骤。