2

目前在网络上存储密码的最佳实践似乎是使用 bcrypt 而不是 sha256 或任何其他散列算法。Bcrypt 看起来很棒,但我认为它有一个缺陷:如果我有一个使用 10 工作因子填充密码的数据库,并且我想将该工作因子增加到 12,因为计算能力增加了,那么我无法做到这一点不知道用户密码,这意味着等到他们再次登录。这会给放弃帐户的用户带来问题。

在我看来,另一种解决方案是使用 sha256 并执行等于 2^(工作因子)的次数。如果我这样做,那么当我想增加工作系数时,我可以对每个存储的密码的通过次数进行差异化。

我已经写了一些代码来做到这一点,我想从每个人那里得到关于这是否是一个好主意的反馈。

https://github.com/rbrcurtis/pcrypt

4

2 回答 2

1

做了很多关于这些不同加密算法的挖掘和阅读论文。最终给我一个答案的是crypto.stackexchange.com上的这个问题。我的算法有点类似于shacrypt,我以前没有听说过,但仍然不如 bcrypt。原因是除了工作因素之外,bcrypt 还需要比 sha2 系列更多的内存来处理。这意味着它不能在 GPU 中有效地并行化(尽管在某种程度上它可以,并且在 FPGA 中更容易),而 sha2 可以(并且很容易)。因此,无论 sha2 one 执行多少次,它仍然不如 bcrypt 有效。

顺便说一句,scrypt要好得多,因为它同时具有 CPU 的工作因素和内存因素(因此基本上不可能在 GPU 或 FPGA 中并行化)。唯一的问题是 scrypt 的 nodejs 库目前基本上无法使用,因此可能需要付出一些努力。

于 2012-06-13T13:49:51.193 回答
0

增加 bcrypt 通行证数量的潜在解决方案(或工作因素。我实际上并没有使用 bcrypt,但这是一个与算法无关的答案):

对于存储密码的表中的每个条目,还存储它被散列的通行证的数量。当您达到更多通行证时,保存具有该通行证数量的所有新密码,并将所有通行证少于该通行证的密码设置为在 7 天内过期。当他们输入新密码时,用正确的通行数对其进行哈希处理。

或者,您不能重置密码,但下次他们尝试登录时,重新哈希他们的密码并将其存储在表中。这确实意味着如果人们很长时间没有登录,他们的密码更容易在数据库泄露的情况下被破坏。话虽如此,对于进攻者来说,用更多的传球攻击大量的人比用更少的传球攻击少数人更值得(没关系,因为盐,最后一句话是错误的)。

于 2014-03-14T19:14:37.753 回答