Hash 有人能解释一下盐在存储散列密码时的作用吗?

Hash 有人能解释一下盐在存储散列密码时的作用吗?,hash,sha1,salt,Hash,Sha1,Salt,我很难理解当密码数据库或其他重要信息被破坏时,附加到散列中的salt如何帮助提高安全性 例如,如果salt是“hello”,并附加到密码“password”之后,则salt和密码一起存储为“hellopassword”,并进行哈希运算以生成: 94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 然后再加上盐: hello$94e66f94517d606d5ad6d9191b980408952f2ed2 这怎么更安全?攻击者知道salt,因此现在可

我很难理解当密码数据库或其他重要信息被破坏时,附加到散列中的salt如何帮助提高安全性

例如,如果salt是“hello”,并附加到密码“password”之后,则salt和密码一起存储为“hellopassword”,并进行哈希运算以生成:

94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 
然后再加上盐:

hello$94e66f94517d606d5ad6d9191b980408952f2ed2
这怎么更安全?攻击者知道salt,因此现在可以轻松计算密码。。。正确的?还是我根本就误解了什么

没有,没有“额外的小困难”——可能会有更大的困难

假设有20亿个通用密码。很容易对所有这些进行散列并存储结果。然后,如果您有一个未加密的密码散列,您可以只检查哪些常用密码与给定的散列匹配

现在把它和腌土豆条比较一下。。。现在你有20亿个常用密码,但也有几十亿个可能的密码。计算所有可能的salt/密码组合将花费非常长的时间——希望变得不可行

此外,这意味着即使两个人拥有相同的密码,他们也很可能拥有不同的哈希值——因此,一个用户泄露密码时的疏忽不会危及另一个用户的安全

有关这方面的更多信息,请参阅(如果您还没有),salt有两种帮助:

1) 当两个(或更多)人使用相同的密码时,无盐您可以看到谁使用相同的密码(哈希值都相同)。所以从理论上讲,如果那个人知道其中一个密码,他就知道每个人的密码都有相同的散列。这是一个次要的原因

2) 主要原因是防止通常称为字典攻击或彩虹攻击的攻击。在这些攻击中,有人使用预先计算的哈希数据库作为常用密码。通常情况下,这些数据库的大小都是Gig。但在这一点上,只需根据预先计算的哈希列表查找您拥有的哈希值(哈希密码),并查看相关密码是什么,就非常容易了


通过使用salt值(通常您希望这是一个随机数),散列将与字典不匹配(他们使用所有可能的salt值预先计算所有密码的可能性是指数级的)。因此,即使您的用户使用一个容易被攻击的密码,比如“password”,这在任何密码字典/彩虹表中几乎都是可以保证的,通过预挂起您的随机salt值,您也可以使哈希对攻击者几乎毫无用处。同时,对于您来说,由于salt只是以明文形式存储的,因此您可以很容易地将其添加到明文中,以便比较用户输入的密码。

salt不是附加到哈希中,而是附加到密码中,然后进行哈希处理。这更安全,因为黑客必须知道salt和实际密码,这两个密码都需要严格保护D

您通常不会像示例中那样在sha1之后添加盐。相反,您可以将salt附加到密码“salt$password”中,并从该密码“94e66f94517d606d5ad6d9191b9804085952fed2”生成sha1。这样,salt和密码就不会暴露在任何数据结构中。您如何保守salt的秘密?你会把它作为一个秘密值硬编码在程序中吗?没有必要保留salt秘密——事实上,所有使用salt的Linux密码哈希方案(这是所有常见的方案)都像你所做的那样将salt预先添加到哈希中。Salt的主要工作(使rainbow tables不可行)是完成攻击者是否知道盐,并且将其与密码一起存储可以轻松随意更改盐,而无需让所有用户重置密码。你甚至可以对每个密码使用不同的salt。如果你想测试“password”是正确的密码,你如何在不知道salt的情况下进行测试,“hello”?据我所知,你必须储存盐。。。对吗?您必须存储它,但它可以作为变量“存储”在脚本中。我想,硬编码盐只比完全不盐好一点点。快速提问。如果每次使用不同的salt对密码进行散列,并存储结果值而不是密码。如果您不将散列存储在任何地方,您如何知道用户在登录时给出的密码散列使用的salt是什么?您没有将随机盐存储在数据库中,对吗?如果您使用的是随机盐,则将其与密码一起存储。否则,您无法重新创建哈希来检查密码。这正是我想读的;)检查这个有趣的答案(伊恩在第一个答案中的评论):我无法理解第一个原因(每个人都在谈论这个原因——对不起,我对这个理论是新手)。站点数据库将对所有密码哈希使用相同的秘密salt。那么类似的盐渍密码哈希将有什么不同呢?@Vikas:它们不会。如果您有相同的盐和相同的密码,您将返回相同的哈希。这就是为什么硬编码的盐并不比没有盐好多少。