将sha1转换为bcrypt


Convert sha1 to bcrypt?

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

选项1

每次用户登录时,我都会检查哈希是否以2美元开头。如果不是,我假设它是sha1,取用户输入的密码,获取它的bcrypt哈希,并替换数据库中的旧哈希。

选项2

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

$hash = password_hash("rasmuslerdorf", sha1($password . $salt));

这样,转换速度更快。

但老实说,我真的不喜欢这两种选择。两者都建议我仍然在代码库中保留一个遗留检查,我想去掉它。

从编码标准的角度来看,以上两个建议中哪一个更好?还是有人有更好的解决方案?

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

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

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

添加一个新的DB列,比如说[passNeedSystemUpdate],您的默认值将是1。1=真或是,0=不合格

正常处理用户登录,直到登录结束,然后运行检查passNeedsSystemUpdate=1。如果密码需要更新,那么我们从密码字段中获取用户输入,并更新新密码以及passNeedSystemUpdate,该密码现在将为0。

注意:如果您的数据库遭到破坏,则用户将别无选择,只能创建一个全新的密码。如果您要将当前的加密方式从sha256更改为bycrypt或其他方式,以上只是一点逻辑。