3

使用 Express.js 框架和加密使用 pbkdf2 对密码进行哈希处理,我读到默认算法是 HMAC-SHA1,但我不明白为什么它没有升级到其他家族或 SHA 之一。

crypto.pbkdf2(password, salt, iterations, keylen, callback)

keylen 是我们提供我们想要的 SHA 的变体吗?像 SHA-256,512 等?

此外,HMAC 如何改变输出?

最后,当 SHA1 被破坏时,它是否足够强大?

对不起,如果我把事情搞混了。

4

2 回答 2

1

keylen 是我们提供我们想要的 SHA 的变体吗?像 SHA-256,512 等?

正如您所说的那样,您特别要对密码进行哈希处理,@CodesInChaos 是正确的 - keylen(即 PBKDF2 的输出长度)最多是您的 HMAC 的本机哈希函数的位数。

  • 对于 SHA-1,这是 160 位(20 字节)
  • 对于 SHA-256,即 256 位(32 字节)等。
  • 这样做的原因是,如果你要求一个比散列函数支持的更长的散列(keylen),第一个本机长度是相同的,所以攻击者只需要攻击位。这是 Hashcat 团队发现并修复的问题 1Password。

作为证明的例子:

这是 PBKDF2-HMAC-SHA-1 的 22 个字节 - 这是一个原生哈希大小 + 2 个字节(总共进行了 8192 次迭代! - 前 4096 次迭代生成前 20 个字节,然后我们对集合进行另外 4096 次迭代在那之后!):

  • pbkdf2 sha1“密码”“盐”4096 22
    • 4b007901b765489abead49d926f721d065a429c12e46

这里只是获取 PBKDF2-HMAC-SHA-1 的前 20 个字节 - 即恰好一个本机哈希输出大小(总共进行 4096 次迭代)

  • pbkdf2 sha1“密码”“盐”4096 20
    • 4b007901b765489abead49d926f721d065a429c1

即使你存储了 22 个字节的 PBKDF2-HMAC-SHA-1,攻击者只需要计算 20 个字节......这大约需要一半的时间,因为要获得字节 21 和 22,还要计算另一整组 HMAC 值,然后然后只保留 2 个字节。

  • 是的,你是对的;对于 PBKDF2-HMAC-SHA-1,21 个字节花费的时间是 20 个字节的两倍,而 40 个字节实际上与 21 个字节一样长。然而,41 字节占用的时间是 20 字节的三倍,因为 41/20 介于 2 和 3 之间,互斥。

此外,HMAC 如何改变输出?

HMAC RFC2104是一种加密哈希函数的方法,尤其是那些在您简单地将密钥和文本连接在一起时存在弱点的方法。HMAC-SHA-1 是 HMAC 中使用的 SHA-1;HMAC-SHA-512 是在 HMAC 中使用的 SHA-512。

最后,当 SHA1 被破坏时,它是否足够强大?

如果您有足够的迭代次数(2014 年从上万到下十万或更多),那么应该没问题。尤其是 PBKDF2-HMAC-SHA-512 的优势在于,它在当前显卡(即许多攻击者)上的表现比在当前 CPU(即大多数防御者)上的表现要差得多。

对于黄金标准,请参阅@ThomasPornin 在SHA-1 对密码存储是否安全?,其中一小部分是“对 MD4、MD5 和 SHA-1 的已知攻击是关于碰撞的,这不会影响原像抗性。已经表明 MD4 有一些弱点可以(仅理论上)在尝试时被利用打破 HMAC/MD4,但这不适用于您的问题。Kesley 和 Schneier 在论文中的 2106 秒原像攻击是一种通用权衡,仅适用于非常长的输入(260 字节;这是一百万兆兆字节 -注意 106+60 是如何超过 160 的;这就是你看到权衡没有什么神奇之处)。”

于 2014-02-07T05:09:24.783 回答
0

SHA-1 坏了,但不代表使用不安全;SHA-256 (SHA-2) 或多或少用于未来的验证和长期替代。破碎仅意味着比蛮力更快,但没有必要可行或实际可行(还)。

另请参阅此答案:https ://crypto.stackexchange.com/questions/3690/no-sha-1-collision-yet-sha1-is-broken

一个函数经常被破坏只是意味着我们应该开始迁移到其他更强大的函数,而不是还存在实际的危险。攻击只会变得更强大,所以一旦第一个裂缝开始出现,就考虑替代方案是个好主意。

于 2014-01-20T09:21:17.433 回答