2010-09-04 32 views
7

我很难理解在密码或其他重要信息的数据库受到危害时,如何将附加到哈希值的盐帮助提高安全性。有人可以解释盐如何帮助存储散列密码?

如果盐是,例如,“你好”,并追加到密码“密码”,则盐和密码被存储在一起,“hellopassword”和散列以产生:

94e66f94517d606d5ad6d9191b980408952f2ed2 (sha1) 

与然后附加盐:

hello$94e66f94517d606d5ad6d9191b980408952f2ed2 

这是如何更安全?攻击者知道盐,所以现在可以计算密码,没有多少额外的困难......对吧?或者我从根本上误解了什么?

+3

您通常不会在sha1之后追加salt,就像您在示例中一样。相反,您可以将盐添加到密码“salt $ password”中,然后从'94e66f94517d606d5ad6d9191b980408952f2ed2'生成一个sha1。这样盐和密码就不会暴露在任何数据结构中。 – tidwall 2010-09-04 17:11:01

+0

你会如何保持盐的秘密?你会把它作为程序中硬编码的秘密值吗? – 2010-09-04 17:14:55

+0

没有必要保守盐的秘密 - 事实上,所有使用salt的Linux密码哈希方案(这是所有常见的哈希方案)都会像您所做的那样将salt加入哈希中。无论攻击者是否知道盐的含义,盐的主要工作(使彩虹桌不可行)都可以实现,并且使用密码存储它可以很容易地随意更换盐,而无需让所有用户重置密码。每个密码甚至可以有不同的盐分。 – cHao 2010-09-04 17:22:41

回答

8

不,没有“小额外困难” - 可能会有更大的难度。

想象一下,有二十亿个通用密码。对所有这些进行散列并存储结果很容易。那么如果你有一个无码密码哈希,你可以检查哪些通用密码匹配给定的哈希。

现在比较,用盐腌哈希......现在你有两个十亿常用的密码,而且数十亿可能形成的盐。计算全部可能的盐/密码组合将需要很多很长时间 - 希望变得不可行。

此外,这意味着即使两个人拥有相同的密码,他们很可能会拥有不同的哈希 - 因此,一位用户在泄露密码时不小心不会冒险另一个用户的安全。

Wikipedia entry(如果你还没有的话)以获得更多关于这一点。

6

盐有助于2种方式:

1)当两个(或更多)的人使用相同的密码,不加盐,你可以看到谁使用相同的密码(哈希值都相同)。所以从理论上讲,如果那个人知道那些人的密码中的一个,他就知道每个人的密码都是相同的哈希值。这是一个小原因。

2)的主要原因是为了防止通常被称为字典攻击或彩虹攻击。在这些攻击中,有人使用预先计算的散列数据库作为常用密码。这些数据库通常都是演唱会的大小。但是,在这一点上,只需要对预先计算的散列列表进行哈希查找(哈希密码)并查看相关的密码是什么。

通过使用salt值(通常您希望它是一个随机数),哈希将不会匹配字典(它们预先计算所有可能的盐值的所有密码的机会指数更难)。所以即使你的用户使用一个容易被攻击的密码,说“密码”,这是几乎保证任何在任何密码字典/彩虹表,通过预先等待你的随机盐值,你使哈希几乎保证是无用的给攻击者。与此同时,由于salt只是以明文形式存储,因此您可以很容易地将它添加到明文中,以便比较用户输入的密码。

+0

快速的问题。如果您每次使用不同的盐散列密码,并存储结果值而不是密码。你怎么知道用什么盐来散列用户在登录时给的密码,如果你不把散列存储在任何地方?你不会将随机盐存储在数据库中吗? – 2010-09-04 17:29:26

+2

如果您使用随机盐,则使用密码进行存储。否则,您不能重新创建哈希来检查密码。 – cHao 2010-09-04 17:31:09

+0

这就是我想读的;)检查这个有趣的答案(伊恩在第一个答案中的评论):http://stackoverflow.com/questions/615704/preferred-method-of-storing-passwords-in-database – 2010-09-04 17:40:50

3

盐不会附加到散列,其附加到密码THEN散列。这是更安全的,因为黑客必须知道盐和实际的密码,你应该保护很重。:D

+0

如果你想测试“密码”是否是正确的密码,你怎么做这个不知道盐,“你好”?据我所知,你必须储存盐...对吗? – 2010-09-04 17:12:06

+0

您必须存储它,但它可以作为变量“存储”在脚本中。尽管如此,硬编码盐只比盐腌稍微好一些。 – cHao 2010-09-04 17:28:45