0

我正在建立一个安全性比较重要的网站(再说一遍,什么时候不重要?),我正在寻找存储密码的最佳方式。我知道 MD5 与 SHA-1 一样存在冲突问题,因此我正在考虑通过 SHA-256 或 SHA-512 存储我的密码。

存储较长的散列变体而不是较小的散列变体是否更明智?(即 512 与 256) 与 SHA-256 编码的密码相比,破解 SHA-512 编码的密码需要更多的时间吗?

另外,我读过有关使用“盐”作为密码的信息。这是什么以及它是如何工作的?我是否只是将盐值存储在另一个数据库字段中?如何将其用作哈希值计算的一部分?

4

3 回答 3

3

对于密码存储,您需要的不仅仅是一个散列函数;你需要:

  • 一个非常慢的散列函数(因此蛮力攻击更加困难)
  • 和盐:一个公知的值,与散列一起存储,对于每个散列密码都是不同的,并进入密码散列过程。salt 可以防止攻击者有效地攻击多个密码(例如使用预先计算的哈希表)。

所以你需要bcrypt

对于散列输出大小的点:如果该大小为n位,则n应使攻击者无法实际计算散列函数2 n次;80 位就足够了。因此,128 位的输出已经过大了。您仍然不想使用 MD5,因为它太快了(尽管 MD5 的 100000 次嵌套调用可能已经足够慢了)并且因为在 MD5 中发现了一些结构上的弱点,这些弱点不会直接影响其散列密码的安全性,但仍然是糟糕的公共关系。无论如何,你应该使用 bcrypt,而不是自制的结构。

于 2011-09-15T00:38:49.177 回答
0

这里的一些答案给了你可疑的建议。我建议您前往IT Security Stack Exchange并搜索“密码散列”。你会发现很多建议,其中大部分都经过了安全堆栈交易所的人们的仔细审查。或者,您可以只听@Thomas Pornin,他知道他在说什么。

于 2011-09-16T23:46:19.443 回答
0

碰撞与您的场景无关,因此 MD5 的弱点无关紧要。但是,最重要的是使用需要很长时间来计算的哈希。阅读http://codahale.com/how-to-safely-store-a-password/http://www.jasypt.org/howtoencryptuserpasswords.html(即使您不使用 Java,这些技术仍然有效) .

无论如何,我都会远离 MD5,因为还有其他的哈希值也可以。

于 2011-09-14T07:58:50.487 回答