0

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

  • sha512(salt + username + password) 不好,
  • sha512(username + password) 更糟
  • sha512(password) 简直是白痴。

虽然我部分同意,但真正最好的安全性是什么?有什么比使用用户唯一盐和慢速散列方法(如 SHA512)更安全的方法吗?真正的方法是什么?争论吧!

如果您觉得标题不好,请编辑标题。

4

3 回答 3

0

在讨论最近的 LinkedIn 泄漏时,有人提出了这个关于 bcrypt 的链接。我想我同意......我们应该使用根据一个因素以指数方式增加计算时间的函数。这是我们击败试图使用集群或 GPU 进行哈希计算的人的唯一方法。

于 2012-06-07T00:13:22.850 回答
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 次哈希函数迭代,才被认为可以打败它:)

于 2012-06-07T00:15:26.770 回答
0
  1. 为每个密码生成随机盐。
  2. 避免使用 MD5,甚至 SHA-1。
  3. 使用慢散列算法;SHA-256 目前似乎是一个不错的选择。
  4. 密码存储是拥有自己的(整体)算法有一些好处的少数情况之一。考虑一个有彩虹表的攻击者;如果您的密码存储算法与用于生成彩虹表的算法不同,足以更改生成的值,那么该彩虹表就没用了。攻击者需要知道你的算法,然后生成一个新表。如果选择慢速散列算法,生成新表的成本非常高。

“整体”算法是指如何将明文密码转换为存储值的完整定义。例如SHA-256("mypassword" + "[[" + 40-char-random-alphanum-salt + "]]")。如果您将其更改为使用尖括号而不是方括号,则您已经更改了利用您存储的密码所需的彩虹表。请注意,我并不是提倡编写您自己的哈希算法。您仍然应该选择加密安全的哈希算法。

见MD5作者的这篇文章。他提出了我在上面重复的两个要点:1)如果你使用快速散列算法,你就错过了重点,2)重用整体算法允许重用彩虹表。

于 2012-06-08T19:35:47.003 回答