6

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

选项1

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

选项 2

我替换了我的 auth 类来做到这一点:

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

这样,转换速度更快。

但老实说,我不太喜欢这两种选择。两者都建议我仍然在我想摆脱的代码库中保留遗留检查。

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

4

2 回答 2

2

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

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

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

于 2013-07-11T07:53:25.467 回答
0

添加一个新的 DB col,假设为 [passNeedSystemUpdate],您的默认值为 1。1 = true 或 yes 且 0 = na。

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

注意:如果您的数据库被泄露或已经被泄露,那么用户将别无选择,只能创建一个全新的密码。如果您将当前的加密从 sha256 更改为 bycrypt 或其他内容,以上只是使用的一些逻辑。

于 2016-12-07T14:20:37.627 回答