Bcrypt(4)(=4次迭代)与SHA512或其他不同之处,每个密码都有唯一的salt


Bcrypt(4) (=4 iterations) versus SHA512 or something different with unique salt per password?

背景:

我想在我的小网站上添加一个登录名,这是一个在线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之所以安全,部分原因是它速度慢。你必须确保具有保持该特性的多个回合。–Andrew Moore

另一位用户表示,对他来说,运行microtime()为Bcrypt(9)提供0.314,因此这将接近最优。

问题:

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

Bcrypt(4)几乎立即返回true,但它仍然保持Moore所说的特性吗?(这会是关于RAM的部分,使GPU更难进行预处理吗?)或者SHA512或其他东西在这一点上实际上会同样快但更安全吗?

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

安全始终是关于您试图保护的内容。

如果你更关心你的资源而不是你的安全性,那么bcrypt(2)已经被高估了。对于一个普通的应用程序来说,没有黑客会试图打破这一点,因为它拥有更容易的目标网站,如LinkedIn和许多其他网站,这些网站只使用sha家族的功能,只需一次迭代,而且没有任何限制。他们会追求"唾手可得的果实"。或者他们可能一直试图破解你的应用程序,只是不在密码加密部分。

作为密码哈希算法[1],SHA-512并不比SHA-1安全多少,它并没有为此目的而设计。不过,它们仍然可以用作创建安全加密算法的基元,但这是任何人都不应该做的。要被认为是安全的,加密算法必须是公开的,以便进行同行评审,并且必须通过时间的考验。很明显,必须是为你将要使用它们而设计的。MD5、SHA-X等都是加密算法,但并不是为存储密码而设计的。

只需在您的bcrypt中添加或删除轮次即可。在这种情况下,我会使用1或2。还要记住1轮!=1次迭代。它们呈指数级增长。如果你读过bcrypt是如何工作的,你会发现它不仅仅是迭代。例如,您提到"每个密码唯一的salt"。Bcrypt已经有了。

[1] 对于其他方面,显然更安全

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

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

请注意,这对窃听或中间人尝试(MitM)几乎没有什么作用。为此,您应该使用SSL;密码或散列(如果您在客户端进行散列)可以以其他方式重播。

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

或者SHA512或其他东西在这一点上会同样快速但更安全吗?

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

在我看来,最好的方法是选择一种密码哈希算法(bcrypt、PBKDF2、scrypt),然后根据可用的计算资源和系统的特点调整工作因子,在速度和安全性之间做出最佳权衡。更高的工作系数=更安全,但也更耗费资源。

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