Bcrypt(4)(=4次迭代)与SHA512或使用每个密码唯一盐的其他内容有何区别?

5

背景:

我想在我的小网站上添加登录功能,这是一个在线的php应用程序,我希望它能够承载未来更多的用户活动。

在进一步实现LightOpenID之前,我想先添加一个普通的登录功能。我学习的书名叫做《Head First PHP & MySQL》(2008年),该章节的最终代码使用 SHA('$user_password') 作为mysql查询的一部分。

由于我对Jeff Atwood的写作很感兴趣,所以我对bcrypt和scrypt都很了解。但由于没有php实现scrypt并且没有专用服务器来运行它,所以我决定目前至少研究一下实现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所说的那种特性吗?(这是使GPU暴力破解更加困难的RAM方面吗?)或者在这一点上,SHA512或其他东西实际上也同样快但更安全?

我预计在这种情况下Bcrypt(4)会获胜,但我怎么知道呢? :p


5.2版本已经过时了。你可以选择向主机提供商投诉或者升级到新版本。 - Madara's Ghost
除此之外,这是一个非常不错的主机,价格惊人地便宜。我认为这更像是升级到虚拟专用服务器,而不是完全更换主机的问题。这是未来需要考虑的事情。 - Suzy
3个回答

5

安全始终是关于你试图保护什么。

如果你更关心的是资源而不是安全,那么bcrypt(2)已经过度了。没有黑客会尝试破解正常应用程序的密码加密,他们会选择更容易攻击的网站,像Linkedin和许多其他网站,它们只使用来自sha系列的函数,进行单次迭代和未加盐。他们会选择'低垂果实'。或者他们可能继续尝试攻击你的应用程序,但不是在密码加密部分。

SHA-512作为密码哈希算法并不比SHA-1更安全[1],它并没有为此目的而设计。然而它们仍可以用作创建安全密码学算法的原语,但这不是一个人所能做的。要被认为是安全的,密码学算法必须是公开的以便同行审查,并且必须经得起时间的考验。显然,它们必须根据你要使用它们的目的进行设计。MD5,SHA-X等是密码学算法,但并不适用于存储密码。

只需添加或删除bcrypt的轮数。在这种情况下,我会使用1或2。还要记住,1轮≠1迭代。它们是呈指数增长的。如果你了解有关bcrypt如何工作的知识,你会发现它远不止于迭代。例如,你提到了“每个密码唯一的盐”。Bcrypt已经有了这个。

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


我并没有过多关注日志部分的细节,因为我理解其中的4代表着$log_2_rounds,即“循环次数的对数”(正如Matthew Flaschen在评论中所写)。是的,我知道在bcrypt生成的哈希值中盐已经是一个不可或缺的部分。 - Suzy
@Suzy Well,很抱歉你不喜欢我的回答,但是你不会找到比bcrypt更好的了。你已经知道了scrypt,但你无法利用它。即使你能够利用它,也没有必要担心这个问题。 - ChocoDeveloper
@Suzy 是的,密码和密码哈希算法的设计者总是假设黑客可以访问加密消息或密码以及用于加密它们的算法。对于像bcrypt这样的密码哈希算法,他们甚至可以访问盐,因为它与结果哈希捆绑在一起。 - ChocoDeveloper
2
"SHA-512并不比SHA-1更安全,它也没有被设计成这样。" 这是不正确的。虽然SHA-512使用类似于SHA-1的技术,但SHA-512的一轮内部工作要复杂得多,更难以破解。内部块大小和输出大小也已经扩展。你认为他们为什么首先设计了SHA-2系列?这不是为了速度,SHA-1比任何SHA-2算法都要快。" - Maarten Bodewes
2
@ChocoDeveloper 我要给你点个踩,因为你提供的信息是错误的。这是一个关于安全性的问题,你的建议应该考虑到这一点。我并不是想抨击你,如果你改变或更新信息,我很乐意改为点赞。例如,你可以指出使用SHA-1或SHA-2对于密钥派生函数并不是非常重要,而不是一概而论地说“SHA-512比SHA-1安全性高不了多少”。除此之外,你的回答当然是正确的。 - Maarten Bodewes
显示剩余5条评论

2
你应该关注系统的安全性,而不仅仅是bcrypt的安全性。
当然,如果你想存储密码,bcrypt或PBKDF2是正确的选择。确保为每个用户或密码使用足够大的随机盐。然后尝试最大化迭代次数。如果迭代次数较小,则它就是小的,但任何迭代次数都比没有好。
请注意,这对于窃听或中间人攻击(MitM)几乎没有用处。你应该使用SSL来解决这个问题;否则,密码或哈希值(如果你在客户端进行哈希)可以被重放。
此外,如果你想防止暴力破解攻击(攻击者尝试最常见的密码),你应该创建(或复制)一个良好的密码管理方案。限制错误登录的数量,并让用户创建强密码。还要限制有关错误登录的信息返回给用户的数量,因为该用户可能是攻击者。

是的,我已经计划设置一些东西来强制用户创建安全密码。甚至可以编写一个小段落,解释为什么这很重要,并建议使用半口令。=) - Suzy
我稍后会研究客户端哈希,除了在可能非常慢的机器上运行较慢的JavaScript之外,我不确定它是否有缺点,这可能需要进行速度测试。但是它可以让用户选择自己的迭代次数!(同时减轻服务器的一些负担!) - Suzy
你说的“限制信息量”具体是什么意思呢?如果告知用户在所选时间间隔内还剩下4次尝试机会,之后需要等待1小时才能再次尝试,这样做是否不妥呢? - Suzy
现在许多网站会说“用户名和密码组合无效”,而不是指出哪一个是错误的。当然,为了不惹恼用户,可能需要返回剩余的登录尝试次数。没有人会使用超级安全的系统,这对任何人都没有帮助。但是提到您只剩下一次尝试可能就足够了。 - Maarten Bodewes

1
或者SHA512或其他算法在这一点上实际上同样快但更安全吗?
密码哈希算法的缓慢是一个主要特征(其中bcrypt是其中之一,但SHA-512本身不是)-您的算法越慢(相对于其他算法),攻击者就越难以基于哈希强制破解密码。从这个角度来看,单个SHA-512轮次比bcrypt不太适合用于安全存储密码,因为它速度明显更快。
在我看来,最好的方法是选择一个密码哈希算法(bcrypt、PBKDF2、scrypt),然后调整工作因子,以在可用的计算资源和系统特性下给您提供速度和安全性之间的最佳权衡。更高的工作因子=更安全,但也更耗费资源。
好消息是,与其他功能相比,用户通常很少使用您的登录功能,因此较慢/资源密集型的登录功能的影响通常不是一个大问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接