将sha1转换为bcrypt?

时间:2013-07-10 20:37:37

标签: php passwords sha1 bcrypt

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

选项1

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

选项2

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

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

这样,转换就更快了。

但说实话,我并不喜欢其中任何一种选择。两者都表明我仍然在代码库中保留遗留检查,我想摆脱它。

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

2 个答案:

答案 0 :(得分:2)

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

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

我建议让后备保留在代码中,您将免除客户用无效密码对付用户的麻烦。作为用户,我不喜欢要求点击链接并重新输入密码的电子邮件,因此会教导用户因网络钓鱼而忽略此类电子邮件。如前所述,代码中的这种后退并不坏,这是获得安全密码处理的必要步骤。

答案 1 :(得分:0)

添加一个新的数据库col,假设[passNeedSystemUpdate],您的默认值将是1. 1 = true或yes和0 = na。

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

注意:如果您的数据库遭到入侵或被攻陷,那么除了创建一个全新的密码之外,用户将没有其他选择。如果您将当前加密从sha256更改为bycrypt或其他内容,则上述内容只是一些逻辑。