5

背景:

我想在我的小网站上添加一个登录,这是一个在线 php 应用程序,我想构建它以便将来能够承受大量用户活动。

在进一步研究实现 LightOpenID 之前,我想添加一个普通登录。我正在学习的书名为 Head First PHP & MySQL (2008),本章的最终代码SHA('$user_password')用作 mysql 查询的一部分。

当我对 Jeff Atwood 的作品感兴趣时,我很清楚 bcrypt 和 scrypt。但是由于没有 scrypt 的 php 实现并且没有专门的服务器来运行它,我决定至少现在考虑实现 bcrypt。

但是我并不完全天真,我知道我应该注意不要过度扩展我非常不起眼的托管资源。php 应用程序本身应该始终排在与资源有关的任何其他内容之前。

Andrew Moore 的方法看起来不错(尽管我必须看看如何在我的主机使用的 php 5.2.17 上实现它)并且它带有硬件速度提示:

您应该选择导致 200-250 毫秒工作的轮数。bcrypt 安全的部分原因是它很慢。您必须确保有多个回合保持该特征。——安德鲁·摩尔

另一位用户表示,对于他microtime()来说,Bcrypt(9) 的运行结果为 0.314,因此接近最优。

问题:

鉴于我只有非常简陋的资源可供使用,我想充分利用它们,将大部分资源留给 php 应用程序本身,我还是最好使用 Bcrypt(4) 而不是其他东西吗?

Bcrypt(4) 几乎立即返回 true,但它仍然保留 Moore 所说的那个特性吗?(这会是与 RAM 相关的部分,它使 GPU 暴力破解变得更加困难吗?)或者 SHA512或其他东西实际上会同样快但更安全在此刻?

我希望 Bcrypt(4) 在这种情况下获胜,但我真的知道吗?:p

4

3 回答 3

5

安全性始终与您要保护的内容有关。

如果您更关心您的资源而不是您的安全性,那么 bcrypt(2) 已经是矫枉过正了。没有黑客会试图打破一个正常的应用程序,拥有更容易的目标网站,如 LinkedIn 和许多其他网站,这些网站只使用 sha 系列的功能,只需一次迭代,并且没有加盐。他们将追求“低垂的果实”。或者他们可以继续尝试破解您的应用程序,而不是在密码加密部分。

SHA-512 作为密码散列算法 [1] 并不比 SHA-1 更安全,它并不是为此目的而设计的。虽然它们仍然可以用作创建安全加密算法的原语,但这是任何人都不应该做的事情。为了被认为是安全的,加密算法必须是公开的以供同行评审,并且必须通过时间的考验。显然,必须针对您将要使用它们的内容进行设计。MD5、SHA-X 等是加密算法,但不是为存储密码而设计的。

只需向您的 bcrypt 添加或删除轮次。在这种情况下,我会使用 1 或 2。还要记住 1 轮!= 1 次迭代。它们呈指数增长。如果您了解 bcrypt 的工作原理,您会发现它不仅仅是迭代。例如,您提到了“每个密码的唯一盐”。Bcrypt 已经有了。

[1] 对于其他事情,它显然更安全

于 2012-07-28T20:07:32.377 回答
2

您应该查看系统的安全性,而不仅仅是 bcrypt。

当然,如果你想存储密码,bcrypt 或 PBKDF2 是继续的方式。确保为每个用户或密码使用足够大的随机盐。然后尝试最大化迭代次数。如果它很小,那么它就很小,但是任何迭代都比没有好。

请注意,这对窃听或中间人尝试(MitM)几乎没有作用。您应该为此使用 SSL;否则可以重播密码或哈希(如果您执行哈希客户端)。

此外,如果您想防止暴力攻击(攻击者尝试最常见的密码),您应该创建(或复制)一个好的密码管理方案。限制错误登录的数量并尝试让用户创建强密码。还要限制您返回给用户的有关不正确登录的信息量,该用户可能是攻击者。

于 2012-07-28T22:15:38.780 回答
1

或者此时 SHA512 或其他东西实际上会一样快但更安全吗?

缓慢是密码散列算法的一个主要特征(bcrypt 是其中之一,但 SHA-512 本身不是) - 您的算法越慢(相对于其他算法),攻击者就越难暴力破解密码基于哈希。从这个角度来看,单轮 SHA-512 不如 bcrypt 适合用于安全存储密码的目的,因为它要快得多。

在我看来,最好的方法是选择一个密码散列算法(bcrypt、PBKDF2、scrypt),然后调整工作因子以在速度和安全性之间进行最佳权衡,考虑到您可用的计算资源和特性你的系统。更高的工作系数 = 更安全,但也更耗费资源。

好消息是,与其他功能相比,用户通常很少使用您的登录功能,因此较慢/资源密集型登录功能的影响通常不是大问题。

于 2012-07-28T23:16:41.853 回答