11

在过去的 2 个小时里,我一直在阅读加盐密码,以确保我理解了这个想法。我希望你们中的一些人可以就我的结论分享你们的知识。


如果我是攻击者,并且我获得了对用户数据库的访问权限,我可以获取表中存在的所有每个用户的盐,并使用它们来创建我的彩虹表。对于大桌子,这可能需要很长时间。如果我可以将列表缩减为感兴趣的用户(管理员、模组),我可以使用更大的字典列表来创建彩虹表,从而提高我的点击率......

如果这是真的,那么加盐似乎真的没有多大帮助。它只会稍微减慢攻击者的速度。

我知道理想情况下你会想要强制使用复杂的密码并用唯一和随机的字符串给它们加盐,但是强制使用复杂的密码会惹恼用户(我知道这让我很恼火),所以很多网站都没有这样做。似乎网站正在损害他们的用户,并且强制使用复杂的密码比一个好的加盐方法重要得多。

我想这不是一个问题,而是要求其他人了解情况。

4

7 回答 7

14

加盐的要点是攻击者不能再使用预先存在的字典来攻击系统中的任何用户。他们必须使用该用户的盐为每个用户创建一个全新的字典,这需要时间和精力。如果您在为系统的所有用户创建字典之前了解违规行为,您就有时间采取行动。(提醒用户他们的登录凭据必须更改,这应该会生成一个新的随机盐。)

我会说你应该同时使用盐和你的用户可以容忍的最复杂的密码(密码短语,真的)。尽管如此,加盐仍然是一项基本的安全措施,如果没有它,你真的负担不起。

于 2009-11-17T03:27:55.400 回答
6

保持适当的水分比呼吸更重要吗?

于 2009-11-17T03:40:02.340 回答
5

对于大多数网站,我倾向于使用每个用户使用盐、全局盐(每个算法的盐)和适度的密码复杂性规则(8 个以上字符以及至少 2 个大写/数字/标点字符的某种组合)的方法。使用 salts 需要为您想要破解的每个帐户生成一个彩虹表——假设每个用户使用唯一的 salts。使用全局盐要求您同时破坏数据库和应用程序服务器。就我而言,它们始终是两个独立的系统。使用密码复杂性规则有助于防止使用简单、容易猜到的密码。

对于具有更多权限的帐户,您可能希望实施更高的密码复杂性。例如,我们的 AD 林中的管理员必须拥有至少 15 个字符的密码。它实际上比较短的密码更容易,因为它几乎迫使您使用密码短语而不是密码。

您还希望指导您的用户如何创建良好的密码,或者更好的是密码短语,并了解各种社会工程攻击,这些攻击会绕过您保护数据的所有技术手段。

于 2009-11-17T03:29:26.043 回答
4

好,我们来看看真实数据:

单个 Nvidia 9800GTX 可以计算 3.5 亿个 MD5 哈希/秒。按照这个速度,大小写字母数字字符的整个键空间将在 7 天内完成。7 个字符,两个小时。根据您的算法,应用加盐只会使这些时间增加一倍或三倍。

廉价的现代 GPU 很容易拥有每秒 10 亿个 MD5 哈希值。有决心的人通常会连接其中的大约 6 个,并获得 60 亿/秒,从而使 9 个字符的键空间在 26 天内过时。

请注意,我在这里谈论的是蛮力,因为在这种复杂程度之后,原像攻击可能适用也可能不适用。

现在,如果你想防御专业攻击者,他们没有理由不能获得 1 万亿哈希/秒,他们只会使用专用硬件或一些廉价 GPU 机器的农场,以更便宜的为准。

并且繁荣,您的 10 个字符的密钥空间在 9.7 天内完成,但是 11 个字符的密码需要 602 天。请注意,此时在允许字符列表中添加 10 或 20 个特殊字符只会使 10 个字符的键空间的破解时间分别为 43 或 159 天。

看到密码散列的问题在于它只会减少你徒劳的厄运的时间。如果您想要一些非常强大的东西,但仍然像存储的散列密码一样天真,请选择 PBKDF2。

那么还有一个问题,用户会使用你强迫他在他所有其他网站上使用的这个“强”密码吗?如果他不将它们保存在主密码文件中,他肯定会。并且那些其他站点不会使用您使用的相同的强大哈希算法,从而破坏了您系统的目的。如果不是为了阻止用户在多个站点上使用相同的密码,我真的不明白为什么你希望你的哈希值超级强;如果攻击者可以访问您的哈希值,那么您很可能已经迷路了。

另一方面,就像我将重复一遍又一遍地向人们询问他们的哈希方案有多“安全”的问题一样,只需使用客户端证书,您的所有问题都会得到解决。用户不可能在多个站点上使用相同的凭据,攻击者无法在不修改凭据的情况下破坏您的凭据,如果用户将凭据存储在智能卡上,他们就无法轻易窃取凭据等。

天真地回答您的问题:强密码仅由强哈希算法支持。

于 2009-11-17T03:54:17.360 回答
3

除了对长字符串的要求之外,每个约束都会减小密码阶段空间的大小。约束导致复杂性降低,而不是增加。

如果这似乎违反直觉,请考虑您为破解者提供了一堆可靠的假设。让我用一个我错过的青春的真实故事来说明这一点:

在双素数加密的早期,处理器非常慢,以至于人们倾向于使用 int32 算法来提高速度。这让我可以假设素数在 0 到 40 亿之间。人们总是选择大素数,因为传统观念认为越大越好。所以我使用了一个预先计算好的素数字典并从一个已知的上限开始计算,因为我知道人们通常会选择接近那个上限的键。这通常允许我在大约 30 秒内破解他们的密钥。

坚持使用长密码短语,并使用加盐,没有其他限制。

当人们说“复杂”的技术时,他们通常意味着复杂。转换可能非常复杂,但具有可交换性,不幸的是,如果您不知道这意味着什么,那么您将无法评估该技术的优点。算法的复杂性只能通过默默无闻来提供安全性,这有点像把房子搬到城外而不锁门。

于 2009-11-18T00:50:52.433 回答
1

使用复杂的技术(如 salthash)来保护用户的私人信息安全。

但不要妨碍您的用户。提供建议,但不要妨碍他们。

选择好的密码取决于您的用户。您可以建议如何选择好的密码,接受任何给定的密码,并在给定密码允许的情况下确保用户信息的安全。

于 2009-11-17T03:39:06.157 回答
1

加盐密码和复杂密码都是真正的安全所必需的。通常彩虹表不是为了攻击特定站点而即时创建的,而是预先计算好的。简单地暴力破解密码比根据特定的盐值生成查找表要有效得多。

话虽如此,散列的目的是确保如果您的数据库遭到破坏,攻击者无法恢复密码。它无法阻止攻击者猜出简单的密码。

要求密码复杂性实际上与您要保护的站点类型/数据类型有关。它会惹恼一些用户,并导致其他人在帖子上写下他们的密码并将其粘贴到他们的显示器上。我想说在您的终端上使用强大的哈希和盐是绝对必要的 - 忽略这样做不仅会暴露您的网站,而且会完全危及每个回收用户名/密码组合的用户。

因此,在我看来,无论您网站的安全级别如何,加盐都是强制性的。强制密码复杂性对于高安全性站点是有益的——但绝对是更多的情景。它不能保证您的用户有良好的安全实践。我还要补充一点,对于不需要密码的网站要求安全密码弊大于利,因为用户更有可能回收他们在其他更重要的网站上使用的高安全密码。

于 2009-11-17T03:39:31.653 回答