【发布时间】:2011-04-29 08:44:12
【问题描述】:
我认为这可能是一个愚蠢的问题,但我已经很困惑我应该在这里做什么才能做到最好。
在对密码哈希进行加盐处理时,盐是否也应进行哈希处理或保留为明文?
注意:我在 SHA-256 中对密码进行哈希处理,Salt 是一个预定义的字符串,因为一次只能存储一个密码。
TIA
克里斯(香巴拉)。
【问题讨论】:
我认为这可能是一个愚蠢的问题,但我已经很困惑我应该在这里做什么才能做到最好。
在对密码哈希进行加盐处理时,盐是否也应进行哈希处理或保留为明文?
注意:我在 SHA-256 中对密码进行哈希处理,Salt 是一个预定义的字符串,因为一次只能存储一个密码。
TIA
克里斯(香巴拉)。
【问题讨论】:
盐不应该被散列,因为你需要在散列之前将原始值与密码结合起来。
【讨论】:
没关系。
盐的目的是防止预计算攻击。
无论是散列盐还是单独使用盐,都会导致每次添加相同的数据作为盐。如果你对盐进行哈希处理,那么你实际上所做的就是改变盐。通过首先对其进行哈希处理,您可以将其转换为不同的字符串,然后将其用作盐。没有理由这样做,但这样做也不会做错任何事情。
您只需要保持一致并且每次都使用相同的方法,否则您最终会得到不同的密码哈希。
【讨论】:
你不能散列盐,因为散列是一种方法。您需要盐,以便在散列之前将其添加到密码中。您可以对其进行加密,但这不是必需的。
关于盐的关键是每个密码都应该有自己的盐。理想情况下,每种盐都应该是唯一的,但随机也很好。因此,盐应该足够长,以使其对于每个密码都是唯一的。
如果所有的盐都相同,那么破解者(谁可以看到您的哈希值)很明显,哪些帐户具有相同的密码。哈希值将是相同的。这意味着如果他们破解一个密码,他们无需额外工作即可获得多个帐户。破解者甚至可能针对这些帐户。
你应该假设破解者将获得盐和哈希值,所以哈希算法必须是安全的。
使用任何盐可以防止使用现有的预先计算的彩虹表来破解您的哈希值,并且为每个帐户使用唯一的盐可以消除您的破解者使用您的盐预先计算自己的彩虹表的愿望。
【讨论】:
不,您不能对盐进行哈希处理。盐是明文形式,您需要重新计算密码并与存储在散列密码文件中的密码进行核对。
但是如果你需要一个强加盐程序,你可以用这种方式计算你的加盐密码:
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 应该足够你使用 :-)
【讨论】:
由于盐需要与散列一起保存(或至少必须与散列一起被检索),攻击者可能会同时获得盐和散列密码。在我的一些应用程序中,我已将盐加密 存储在数据库中(使用只有应用程序知道的密钥)。我的理由是,将未加密的盐与散列密码一起存储将更容易破解密码,因为能够检索密码表(并且会知道或对散列算法做出假设)的黑客将能够通过散列字典中的每个单词,然后用他也可以访问的盐进行加盐,来找到众所周知的单词散列之间的匹配(字典攻击)。如果盐是加密的,那么除非他还可以访问应用程序已知的加密密钥,否则这种攻击是不可能的。
(如果有人看到这个逻辑有问题,请发表评论。)
【讨论】: