给出:
$salt - 一个足够长的伪随机生成的字符串
$pepper - 一个足够强大的私钥,只有存储密码的数据库的管理员知道
你会看到吗
$hash = bcrypt(hmac($userpassphrase,$pepper),$salt)
有意义地优于
$hash = bcrypt($userpassphrase,$salt)
考虑到管理/存储 $pepper 和 $salt 的额外负担?
我的假设是 hmac 并没有有意义地加强由此产生的 $hash,并且存储 $pepper 的负担超过了任何假设的好处......但我很想听到明智的意见。
最佳答案
key 散列或 HMac 用于验证数据源,而不用于密码保护。例如,如果你和我有一个共享 key ,我可以将一些数据与计算出的 hmac 一起发送给你,你可以使用相同的 key 来检查 hmac 哈希值是否匹配,如果匹配,你就知道数据来自我,并没有被改变。
您无法有效地在机器上隐藏攻击者无法访问的 secret 密码,您要做的就是添加一层隐藏。在没有共享 key 的情况下使用 HMac 本质上与执行 SHA($userpassphrase, $salt) 相同,它非常容易计算,因此一旦“secret “密码是已知的。
bcrypt 的全部目的只是为了减慢散列过程,因此攻击者需要很长时间才能为您的盐生成彩虹表。如果你想让你的密码散列方案更安全,只需增加原始散列函数的成本。在 bcrypt 中,您可以指定“logRounds”的数量(我认为这就是他们所说的),这是执行散列的次数。如果您指定 logRounds 为 15(默认值为 10),则哈希将执行 2^15 = 32768 次,这会显着降低速度。执行散列所需的时间越长,攻击者破解它所需的时间就越长。
关于cryptography - bcrypt 用 hmac'd 密码改进了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11106087/