2012-07-28 53 views
5

背景:对SHA512进行加密(4)(= 4次迭代),或者每个密码都有独特的salt加密?

我想登录添加到我的小网站,这是一个在线的PHP应用程序,我想建立能够承受多大的用户活动的未来。

在我进一步研究实现LightOpenID之前,我想添加一个正常的登录。我从中学习的这本书被称为MySQL(2008),并且本章的最终代码使用SHA('$user_password')作为mysql查询的一部分。

当我对杰夫·阿特伍德的写作感兴趣时,我非常了解bcrypt和scrypt。但是由于没有php的scrypt实现,没有专门的服务器来运行它,所以我决定至少考虑实现bcrypt。

但是我并不完全天真,我知道我应该小心不要过度伸展我非常谦虚的托管资源。 PHP应用程序本身应该始终首先放在关于资源的其他任何东西之前

Andrew Moore's method看上去不错(虽然我得看看如何实现它在PHP 5.2.17这我的主机使用),并带有硬件速度的提示:

你应该选择一个数字的轮次,结果在200-250毫秒的 工作。 bcrypt安全的原因之一在于速度很慢。你必须确保有一些回合保持这一特征。 - 安德鲁·摩尔

另一位用户指出,他跑microtime()给出了0.314的Bcrypt(9),这从而将接近最优。

问题:

视为我只在我手上有很不起眼的资源,我想做出最好的人,剩下的大部分为PHP应用程序本身,我还在更好使用Bcrypt(4)而不是别的东西?

Bcrypt(4)返回true几乎是瞬间,但它仍然保持这一特性穆尔谈?(请问这是关于部分RAM,使得它更难GPU暴力破解?)还是会SHA512 或别的东西实际上在这一点上一样快但更安全?

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

+0

5.2是古老的。要么喊叫,要么替换你的主人。 – 2012-07-28 20:32:50

+0

这是一个非常体面的主机,否则,虽然令人惊讶的便宜,我认为这是一个虚拟专用服务器的升级,而不是完全改变主机,问题。这是功能的东西。 – Suzy 2012-07-28 20:43:03

回答

5

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

如果您更关心自己的资源而不是关于您的安全性,bcrypt(2)已经过分了。没有黑客会试图打破常规应用程序,拥有像LinkedIn和其他许多更简单的目标站点,这些站点只使用来自sha家族的功能,只需一次迭代,并且无需使用。他们将为“低垂的果实”而努力。或者他们可以继续尝试破解你的应用程序,而不是在密码加密部分。

SHA-512并不比SHA-1更安全,如密码散列算法[1],但它并不是为此目的而设计的。尽管如此,它们仍然可以用作创建安全密码算法的原语,但这是没有人应该做的。要被认为是安全的,加密算法必须公开进行同行评审,并且必须通过时间测试。显然,必须针对你要使用它们的设计进行设计。 MD5,SHA-X等是加密算法,但不是为存储密码而设计的。

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

[1]对于其他的东西它显然更安全

+0

我没有把注意力放在日志部分的细节上,因为我理解它代表'$ log_2_rounds'这是“圆记数”(正如Matthew Flaschen在评论中写的那样)。是的,我知道salt已经是bcrypt中生成的散列的一个组成部分。 – Suzy 2012-07-28 20:31:17

+0

@Suzy很抱歉,您不喜欢我的回答,但您不会找到比bcrypt更好的东西。你已经知道了scrypt,但是你将无法利用它。即使你能做到,也不用担心这一点。 – ChocoDeveloper 2012-07-28 20:43:15

+0

我没有说我不喜欢你的答案:p它的信息量很大,我只是没有立即接受我得到的第一个答案。 – Suzy 2012-07-28 20:49:10

2

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

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

请注意,这对中间企图(MitM)中的窃听或男人没什么作用。你应该使用SSL;密码或散列(如果你做散列客户端)可以以其他方式重播。此外,如果您想防范强力攻击(攻击者尝试最常见的密码),您应该创建(或复制)一个好的密码管理方案。限制不正确登录的数量并尝试让用户创建强密码。还会限制您返回给用户的关于不正确登录的信息量,该用户可能是攻击者。

+0

是的,我已经计划设置强制用户创建安全密码。甚至可以用一小段文字来解释为什么它很重要,并提出半密码短语。 =) – Suzy 2012-07-29 18:18:29

+0

稍后我会研究客户端散列问题,我不确定是否有其他方面的缺点,除非在可能非常慢的机器上以较慢的JavaScript运行它,这可能会导致它需要进行速度测试。但它可以让用户选择他/她自己的迭代计数! (伴随着服务器的压力!) – Suzy 2012-07-29 18:28:04

+0

你究竟是指“限制信息量”呢?传达在所选时间间隔内剩余的尝试次数是否是错误的?例如:“您还剩4次尝试,之后您需要等待1个小时才能再次尝试。” – Suzy 2012-07-29 18:31:41

1

或者SHA512或其他的东西在这一点上会如此快速但更安全?

慢度是密码散列算法的一个主要特性(其中bcrypt是1,但SHA-512本身不是) - 算法越慢(相对于其他算法),它越难一个攻击者基于哈希强制密码。从这个角度来看,单一轮SHA-512比bcrypt更不适合安全存储密码,因为它速度更快。

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

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