2010-10-22 52 views
5

我认为这可能是一个愚蠢的问题,但我对于我应该在这里做的最好的事情感到非常困惑。Salt的密码哈希值应该是“哈希”吗?

当腌制密码哈希时,该盐是否应该散列或保留为明文?

注意:我在散列SHA-256和盐密码是唯一的密码将会被存储在一个时间一个预定义的字符串。

TIA

Chris(Shamballa)。

回答

15

没关系。

盐的目的是防止预计算攻击。

无论采用哪种方法,散列盐或单独使用盐都会导致每次都会以盐形式添加相同的数据。如果你把盐加了盐,你所做的只是改变盐。通过首先对它进行哈希处理,将其转换为不同的字符串,然后将其用作盐。没有理由这样做,但如果你这样做,它不会做任何错误。

你只需要保持一致,并使用同样的方法,每次否则你会最终有一个不同的密码哈希值。

+0

我仍然强烈建议不要使用静态盐。即使您一次只存储一个密码,它可能会破坏盐的目的。 – Slartibartfast 2010-10-25 04:14:24

+0

我同意,不同的盐可能应该用于每个密码,你只需要使用相同的盐每次给定用户的密码。但是这里的要点是盐只是额外添加的东西。在使用盐之前对盐进行散布并不会改变这一点,它只是使它成为一种额外的东西。 – 2010-10-25 05:12:34

+0

它的语义,但你不能散列盐。必须以明文形式检索盐才能使用。由于散列是一种方式,所以你不能散列你的盐。如果你想使用散列算法来生成你的salt,那很好,但是结果散列值变成新的salt,你仍然必须能够以明文形式检索它。如果你真的打了你的盐,你已经失去了你的帐户。 – 2011-01-24 19:45:15

1

盐不应该被散列,因为在散列之前需要将原始值与密码结合使用。

7

由于散列是一种方式,所以不得散列盐。您需要盐,以便在散列之前将其添加到密码。你可以加密它,但没有必要。

盐的关键是每个密码都应该有自己的盐。理想情况下,每种盐应该是独一无二的,但随机也是很好的。因此,盐应足够长,以使其对每个密码都是唯一的。

如果所有的盐是一样的,这是明显的裂解炉(谁可以看到你的哈希值),占具有相同的密码。散列值将是相同的。这意味着如果他们破解一个密码,他们会获得多个帐户,而不需要额外的工作。破解者甚至可能以这些账户为目标。

你应该假设黑客将获得两盐和散列值,所以该散列算法必须是安全的。

任何盐都可以防止使用现有的预先计算的彩虹表来破解你的散列值,并为每个帐户有一个独特的盐,消除了你的饼干使用你的盐预先计算自己的彩虹桌的愿望。

+1

@aaaa bbbb,如果您在存储它之前对它进行哈希处理,则无法检索密码。如果你在你的代盐中使用哈希算法,那很好。 salt是在哈希值之前添加到明文中的部分。在此之前它不是盐。 – 2010-11-11 15:24:20

0

不,你不得散列盐。 salt的文本是明文的,需要您重新计算密码并使用散列密码文件中存储的密码进行检查。

但是如果你需要一个强大的腌制过程就可以计算以这种方式您的盐渍密码:

SaltedHashedPwd = H(H(H(H(... H(PWD-K + SALT-K )+ SALT-K)+ SALT-K).....)+ SALT-K + N

H是散列函数 SALT-k被你作为盐 PWD-k上使用的k随机串是第k密码 (每密码具有不同的盐) Ñ是构成H函数的迭代次数

在PKCS#5标准中,它使用N = 1000!

在这种方式下,字典攻击是不可能的,因为对于字典中的每个字词和每个SALT到密码文件中,攻击者都需要计算哈希。过于膨胀的时间!

我认为,N = 100应该够你使用:-)

+1

错误。 “没关系”是正确的答案。你可以散列盐,这实际上给你一个新的盐。你所要做的就是保持一致。 – 2010-10-22 21:48:57

+0

看看我写的更好。您可以将PWD和SALT连接起来,但最后必须连接SALT的清除形式。否则,您无法在验证阶段重新计算散列值。 – robob 2010-10-23 07:29:10

0

随着盐需要随着散列被保存(或至少必须与哈希一起检索),攻击者可以可能会同时获得salt和哈希密码。在我的一些应用程序中,我将加密的加密的存储在数据库中(只有应用程序已知密钥)。我的推理是,将未加密的salt与散列密码一起存储会使得破解密码变得更容易,因为能够检索密码表的黑客(并且将知道或假定关于散列算法)将能够通过对字典中的每个单词进行散列,然后用他也可以访问的盐进行盐析来找到众所周知的单词(字典攻击)的哈希之间的匹配。如果盐会被加密,那么这种攻击是不可能的,除非他也可以访问应用程序已知的加密密钥。

(如果有人看到了这个逻辑故障,请评论。)