正确使用盐和散列的方法

时间:2012-06-07 00:03:17

标签: security hash salt sha

在与其他几个人的讨论中,我读到了

的论点
  • sha512(盐+用户名+密码)不好,
  • sha512(用户名+密码)更糟糕
  • sha512(密码)很愚蠢。

虽然我部分同意,但真正最好的安全性是什么?有没有什么比使用用户独特的盐和慢速哈希方法(如SHA512)更安全?真正的方法是什么?争辩!

如果发现不好,请编辑标题。

3 个答案:

答案 0 :(得分:0)

在讨论最近的LinkedIn漏洞时,有人提出了link about bcrypt。我想我同意......我们应该使用根据一个因素以指数方式增加计算时间的函数。这是我们尝试使用集群或GPU进行散列计算的唯一方法。

答案 1 :(得分:0)

我的理解是,重复散列(计算成本)&一个好的随机盐,应该击败所有但严重认定的加密攻击者。

在数据库中以及通过网络散列密码,可以避免明信片被进入的窥探者或攻击者恢复(并可在其他地方使用)。

基本上,这或多或少是Wordpress身份验证使用的方案:

var SALT = 64 random characters;
var NUM_HASHES = about 1000;    // can be randomized
var hashedResult = inputPassword;
for (int i = 0; i < NUM_HASHES; i++) {
  var dataToHash = SALT + hashedResult;
  hashedResult = secureHash( dataToHash);
}
//... can now store or send.

使用随机盐和循环哈希,可以击败任何彩虹表或单级“哈希冲突”,“哈希弱点”攻击。只有通过1000次迭代的哈希函数强制完成键空间,每个键才被认为是打败它:)

答案 2 :(得分:0)

  1. 为每个密码生成随机盐。
  2. 避免使用MD5,甚至是SHA-1。
  3. 使用慢速哈希算法; SHA-256现在似乎是一个不错的选择。
  4. 密码存储是极少数情况下,拥有自己的(整体)算法有一些好处。考虑一个有彩虹表的攻击者;如果您的密码存储算法与用于生成彩虹表的算法不同,足以更改生成的值,则该彩虹表是没有用的。攻击者需要知道您的算法,然后生成一个新表。如果选择慢速哈希算法,生成新表非常昂贵。
  5. “整体”算法,我指的是如何将明文密码转换为存储值的完整定义。例如。 SHA-256("mypassword" + "[[" + 40-char-random-alphanum-salt + "]]")。如果您将其更改为使用尖括号而不是方括号,则您已更改了利用存储密码所需的彩虹表。请注意,我不是主张编写自己的哈希算法;你仍然应该选择加密安全的哈希算法。

    请参阅MD5的作者this article。他提出了我在上面重复的两个要点:1)如果你使用快速哈希算法,你就会忽略这一点,2)重用整体算法可以重复使用彩虹表。