密码哈希的盐值是否也应该进行“哈希”处理?

6

我认为这可能是一个愚蠢的问题,但我已经变得非常困惑,不知道该怎么做才是最好的。

当对密码哈希进行加盐时,盐也应该被哈希还是保留明文?

注意:我正在使用SHA-256对密码进行哈希,并且盐是预定义字符串,因为一次只会存储一个密码。

TIA

Chris(Shamballa)。

5个回答

15

没关系。

盐的作用是防止预先计算攻击。

无论如何,哈希盐或仅使用它,结果都将添加相同的数据作为盐。如果您对盐进行哈希处理,您实际上只是更改了盐。通过先对其进行哈希处理,您将其转换为不同的字符串,然后将其用作盐。没有理由这样做,但如果您这样做,它不会造成任何错误。

您只需要保持一致并每次使用相同的方法,否则您将得到不同的密码哈希值。


我仍然强烈建议不要使用静态盐。即使您一次只存储一个密码,这可能会使盐的作用失效。 - Slartibartfast
我同意,每个密码应该使用不同的盐,但对于给定用户的密码,您只需要每次使用相同的盐。但这里的重点是盐只是额外添加的东西。在使用盐之前进行哈希处理并不会改变这一点,它只是使其成为另一种不同的额外添加物。 - Alan Geleynse
1
这是语义问题,但您不能哈希盐。为了使用它,盐必须以明文的形式检索。由于哈希是单向的,因此您不得哈希盐。如果您想使用哈希算法生成盐,则可以这样做,但生成的哈希值成为新的盐,仍然必须能够以明文形式检索它。如果您真的哈希了盐,则已经失去了账户。 - Marcus Adams

7
你不能对盐进行哈希,因为哈希是单向的。你需要盐以便在哈希之前将其添加到密码中。你可以加密它,但这并不是必要的。
关于盐的关键是每个密码都应该有自己的盐。理想情况下,每个盐都应该是独特的,但随机也是好的。因此,盐应该足够长,以允许为每个密码生成唯一的盐。
如果所有的盐都相同,那么对于骇客(可以查看你的哈希值)来说,哪些账户具有相同的密码就很明显了。哈希值将是相同的。这意味着如果他们破解一个密码,他们将无需额外努力即可获得多个账户,甚至可能会针对这些账户。
你应该假设骇客将获取盐和哈希值,因此哈希算法必须是安全的。
任何盐的存在都会防止使用现有的预先计算的彩虹表来破解您的哈希值,而为每个账户提供唯一的盐则消除了骇客使用您的盐预先计算自己的彩虹表的欲望。

1
@aaaa bbbb,如果在存储盐之前对其进行哈希处理,则无法检索密码。如果在生成盐时使用哈希算法,那么就可以了。盐是在将明文添加到值之前添加的部分。在此之前它不是盐。 - Marcus Adams

1

盐值不应该被哈希,因为在哈希之前需要将原始值与密码组合。


0

不,您不应该对盐进行哈希。盐是明文的,需要您重新计算密码并将其与存储在哈希密码文件中的密码进行检查。

但是,如果您需要一个强大的加盐过程,可以按照以下方式计算加盐密码:

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

H是哈希函数 SALT-k是您用作盐的k随机字符串 PWD-k是k密码 (每个密码都有不同的盐) N是您组成H函数的迭代次数

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

这样一来,字典攻击就不可能了,因为对于字典中的每个单词和密码文件中的每个SALT,攻击者都需要计算哈希值。时间上太昂贵了!

我认为N = 100对您的用途足够了 :-)


1
错误。"没关系"是正确的答案。您可以对盐进行哈希处理,从而获得一个有效的新盐。您所要做的就是保持一致性。 - aaaa bbbb
看清楚我写的内容。你可以拼接PWD和SALT,但最后必须将SALT的明文形式拼接起来。否则,在验证阶段无法重新计算哈希值。 - robob

0

由于盐需要与哈希值一起保存(或者至少必须能够与哈希值一起检索),攻击者可能会获取到盐和已哈希的密码。在我的一些应用程序中,我将盐以加密的方式存储在数据库中(使用应用程序唯一知道的密钥)。我的想法是,如果将未加密的盐与哈希密码一起存储,那么破解密码就会更容易,因为黑客可以检索密码表(并且知道或假设哈希算法),通过对字典中的每个单词进行哈希,然后加上他也可以访问的盐来查找众所周知的单词的哈希匹配(字典攻击)。如果盐被加密,除非他还可以访问应用程序知道的加密密钥,否则这样的攻击是不可能的。

(如果有人发现这种逻辑上的错误,请评论。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接