hash(hash())vs salted hash

时间:2010-12-19 13:37:01

标签: security hash salt password-hash

由于Rainbow tables的引入,并且仅使用散列密码(e.x:MD5)存储在数据库中的密码为not the best secured way

当人们谈论盐渍哈希时,总是以这种方式hash(password . salt)甚至hash(hash(password) . salt)使用它。

我不知道为什么要使用salt,并为每个密码添加额外的条目来存储盐? 为什么我们不使用hash(hash(password)),甚至hash(hash(hash(password)))

放盐更安全吗?还是只是感觉更复杂?

8 个答案:

答案 0 :(得分:23)

您可以在哈希(pwd)的两倍时间内构建基于哈希字典(哈希(pwd))的彩虹表(甚至更少,因为性能主要是关于光盘写入),甚至不会大。使用盐极大地扩展了表格所需的大小,使其达到不切实际的程度。

另外(更重要的是),用户通常拥有相同的密码。如果您没有为每个用户设置单独的盐,如果您已经破坏了一个用户密码,那么您已经破坏了所有其他具有相同密码的用户。

答案 1 :(得分:12)

为了简单起见,让我们假设每个人都使用数字作为密码。

如果每个人都使用8位数作为他们的密码,那就是100,000,000种可能性。如果您试图破坏系统,则需要散列所有这些可能性。如果你有一个“哈希散列哈希”,你仍然需要哈希那些100,000,000种可能性 - 只是稍微复杂一点。

现在让我们假装我们还有一个4位数的盐。现在,而不是100,000,000种可能性,有1,000,000,000,000 ......我们给潜在的攻击者提供了10,000倍的工作量,而不仅仅是工作量的3倍。

基本上,将盐视为人为地缩短每个人密码的方式,从而扩大字典攻击必须处理的空间。

编辑:要明确的是,鉴于盐也以纯文本形式提供,您仍然只有100,000,000种可能性来尝试攻击任何一个哈希。但是,这意味着在尝试使用一个密码的可能性之后,攻击者就没有任何有用的信息来攻击另一个密码。如果没有盐,攻击者可以创建一个100,000,000种可能性的字典,然后在数据库中知道所有密码,只给出它们的哈希值。换句话说,盐有助于防止批量攻击。它们还意味着你无法预生成字典:为了有效地攻击单个密码,你必须事先知道盐。如果没有salt,您可以在访问哈希值之前计算每个可能密码的哈希值。

答案 2 :(得分:6)

如果您不使用salt,则攻击者可以构建单个彩虹表,可用于攻击数据库中的每个密码。多次散列不会在没有盐的情况下保护你,因为彩虹表通过将哈希链接在一起完全按照你描述的方式工作:hash(hash(password))

如果为每个用户添加随机盐,则攻击者无法重复使用同一个表来破解两个密码,因此他们的工作变得更加困难。作为额外的好处,如果使用salt,则具有相同密码的两个用户将散列为不同的值。

你想要迭代哈希仍然很好,但你也需要盐。如果你这样做:

function hashPassword(password, salt) {
    result = hash(salt . password)
    for (i = 0; i < 1000; i++) {
        result = hash(salt . result)
    }
    return result
}
然后,你使攻击者的工作难度增加1000倍,对合法用户的影响可以忽略不计。请注意,攻击者可以在单个低端计算机上每秒测试数百万个候选密码 - 哈希函数设计得很快。这1000次迭代循环可以将可行的攻击改为需要100年或更长时间的攻击。当计算机在18个月内加速时,只需将迭代次数更改为2000次。

salt,散列算法和迭代计数不需要保密,可以与计算的散列一起存储在数据库中。您可以选择固定的迭代计数和哈希算法,但必须为每个用户随机生成盐

答案 3 :(得分:3)

迭代哈希并使用salt都会增加密码哈希的安全性。但它们可以抵御完全不同的攻击。<​​/ p>

迭代哈希增加了暴力攻击所需的工作。但是你不应该像你的建议那样使用天真的迭代,而是为它设计一个算法,比如PBKDF2

salt可以防止预先计算的表格,因此每个网站和用户都应该有所不同。

答案 4 :(得分:0)

盐的观点是使字典攻击没有实际意义。现在无论你重新散列多少哈希,相同的输入总是会产生相同的输出哈希,因此可以为它构建一个字典。因此,虽然多次散列可能会使暴力攻击变得更加困难,但它对字典攻击没有任何作用。

答案 5 :(得分:0)

没有什么可以阻止任何人建立一个用于双重哈希密码的Rainbow表。

答案 6 :(得分:0)

我使用比较方法来为登录的用户散列密码。在会话中生成salt(随机值)并将其发送到客户端。用户输入他们的密码,然后用盐进行哈希处理并发回。这样可以确保每次从服务器发送的值都不同,这使得在中间攻击中使用人员更难打破。

答案 7 :(得分:-1)

salt是特定于站点或用户的值。 这意味着,为了检索密码,攻击者必须同时访问数据库并知道盐。

此外,攻击者还可以生成一次表,然后将其用于多个站点。但是,对于盐,攻击者必须为每个站点生成一个表,或者每个用户生成一个表(使攻击更慢)。

网站特定的盐对网站的安全性几乎没有什么影响。正如评论中所述,具有特定于站点的盐和用户特定盐的组合可以显着提高安全性,而不仅仅是特定于站点的盐。

几年前,我在stackoverflow上问过一个关于密码存储的问题,这可能对你有所帮助。请参阅Secure hash and salt for PHP passwords