加密 - Express.js是PBKDF2 HMAC-SHA1够吗?

时间:2014-01-20 08:53:37

标签: hash express cryptography sha pbkdf2

使用Express.js框架和crypto用pbkdf2散列密码我读到默认算法是HMAC-SHA1,但我不明白为什么它还没有升级到其他系列之一或SHA。

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

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

HMAC如何改变输出?

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

对不起,如果我搞混了。

2 个答案:

答案 0 :(得分:1)

  

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

当你声明特别是哈希密码时,@ CodeInChaos是正确的 - keylen(即PBKDF2的输出长度)最多是你HMAC本地哈希的位数功能

  • 对于SHA-1,那是160位(20字节)
  • 对于SHA-256,那是256位(32字节)等
  • 这样做的原因是,如果要求比哈希函数支持更长的哈希(keylen),则第一个本机长度是相同的,因此攻击者只需要攻击位。这是当Hashcat团队找到它时发现并修复的1Password问题。

作为证明的例子:

这里有22个字节的PBKDF2-HMAC-SHA-1 - 一个本地散列大小+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在Is SHA-1 secure for password storage?中给出的答案,其中很小一部分是#34;对MD4,MD5和SHA-1的已知攻击是关于碰撞,不会影响前像抗性。已经证明MD4有一些弱点,在尝试打破HMAC / MD4时可以(仅在理论上)被利用,但这不适用于您的问题。 Kesley和Schneier在论文中进行的2106秒前像攻击是一种通用的权衡,仅适用于非常长的输入(260字节;超过100万兆字节 - 注意106 + 60超过160;'在那里,你看到权衡没有任何魔力)。"

答案 1 :(得分:0)

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

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

  

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