在与其他几个人的讨论中,我读到了以下论点
- sha512(salt + username + password) 不好,
- sha512(username + password) 更糟
- sha512(password) 简直是白痴。
虽然我部分同意,但真正最好的安全性是什么?有什么比使用用户唯一盐和慢速散列方法(如 SHA512)更安全的方法吗?真正的方法是什么?争论吧!
如果您觉得标题不好,请编辑标题。
在讨论最近的 LinkedIn 泄漏时,有人提出了这个关于 bcrypt 的链接。我想我同意......我们应该使用根据一个因素以指数方式增加计算时间的函数。这是我们击败试图使用集群或 GPU 进行哈希计算的人的唯一方法。
我的理解是,重复散列(为了计算成本)和一个好的随机盐应该可以击败所有坚定的加密攻击者。
在数据库中和通过网络对密码进行哈希处理,可以避免窥探者或攻击者可以恢复(并在其他地方使用)明文。
基本上,这或多或少是 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 次哈希函数迭代,才被认为可以打败它:)
“整体”算法是指如何将明文密码转换为存储值的完整定义。例如SHA-256("mypassword" + "[[" + 40-char-random-alphanum-salt + "]]")
。如果您将其更改为使用尖括号而不是方括号,则您已经更改了利用您存储的密码所需的彩虹表。请注意,我并不是提倡编写您自己的哈希算法。您仍然应该选择加密安全的哈希算法。
见MD5作者的这篇文章。他提出了我在上面重复的两个要点:1)如果你使用快速散列算法,你就错过了重点,2)重用整体算法允许重用彩虹表。