密码哈希的盐是否应该“哈希”?

时间:2010-10-22 19:50:39

标签: security delphi passwords

我认为这可能是一个愚蠢的问题,但我对这里应该做的最好的事情感到很困惑。

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

注意:我在SHA-256中散列密码,Salt是预先定义的字符串,因为一次只能存储一个密码。

TIA

克里斯(Shamballa)。

5 个答案:

答案 0 :(得分:15)

没关系。

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

无论哪种方式,对盐进行散列或单独使用它,每次都会导致相同的数据被添加为盐。如果你对盐进行散列,你所做的只是改变盐。首先对它进行散列,然后将其转换为另一个字符串,然后将其用作salt。没有理由这样做,但如果你这样做,它就不会有任何错误。

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

答案 1 :(得分:7)

你不能哈希哈希,因为哈希是一种方式。您需要salt,以便在散列之前将其添加到密码中。你可以对它进行加密,但这不是必需的。

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

如果所有的盐都相同,那么对于破解者(谁可以看到你的哈希值)来说,这是显而易见的,哪些帐户具有相同的密码。哈希值将是相同的。这意味着如果他们破解了一个密码,他们就会获得多个帐户而无需额外的工作。破解者甚至可能针对这些帐户。

你应该假设破解者将同时获得salt和hash值,因此哈希算法必须是安全的。

任何盐都可以防止使用现有的预先计算的彩虹表来破解你的哈希值,并且每个帐户都有一个独特的盐消除了你的破解者用你的盐预先计算他们自己的彩虹表的愿望。

答案 2 :(得分:1)

不应对哈希值进行哈希处理,因为在对哈希值进行哈希处理之前,您需要将原始值与密码结合使用。

答案 3 :(得分: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应该足以满足您的需求: - )

答案 4 :(得分:0)

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

(如果有人在此逻辑中发现错误,请发表评论。)