Crypto-Express.js是否PBKDF2 HMAC-SHA1够了?

问题描述:

使用Express.js框架和密码与pbkdf2散列密码我读了默认算法是HMAC-SHA1,但我不明白为什么它没有升级到其他家族或SHA之一。Crypto-Express.js是否PBKDF2 HMAC-SHA1够了?

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

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

另外HMAC如何改变输出?

最后当SHA1被破坏时它足够强大吗?

对不起,如果我混合东西了。

+0

只是不要使用超过20个字节的keylen。 – CodesInChaos

+0

PBKDF2相对于其他密码哈希的缺点,比如bcrypt或scrypt比SHA-256在这方面的缺点要大得多。 – CodesInChaos

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

当你说出你哈希尤其是密码,@CodesInChaos是正确的 - KEYLEN(即从PBKDF2输出的长度)会在你HMAC的本地哈希函数的比特最数目。

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

实施例为证明:

这里是22个字节值得PBKDF2-HMAC-SHA-1的 - 这是一个天然的散列大小+ 2多个字节(共服用8192次迭代 - 第4096次迭代!产生前20个字节,那么我们做的是另4096次迭代集合后):

  • PBKDF2 SHA1 “密码” “盐” 4096 22
    • 4b007901b765489abead49d926f721d065a429c12e46

,这里是刚刚起步的前20个字节的PBKDF2-HMAC-SHA-1 - 即只有一个本土的散列输出大小(以总共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?中给出的答案,其中的一小部分内容是“对MD4,MD5和SHA-1的已知攻击是关于碰撞,而不影响前像抵抗。表明MD4有一些弱点,当试图破坏HMAC/MD4时可能(只在理论上)被利用,但这不适用于你的问题.Kesley和Schneier在论文中的2106秒原像攻击是一种通用的折衷它只适用于非常长的输入(260字节;这是一百万太字节 - 注意到106 + 60超过了160;这就是你看到这种折衷没有什么魔力的地方)。“

SHA-1坏了,但并不意味着它不安全; SHA-256(SHA-2)或多或少可用于未来的打样和长期替代。破碎意味着比bruteforce更快,但没有可行或实用的可行性(但)。

也看到这个答案:https://crypto.stackexchange.com/questions/3690/no-sha-1-collision-yet-sha1-is-broken

一个功能越来越坏往往只意味着我们应该开始 迁移到其他功能更强,而不是有 实际危险呢。攻击只会变得更加强烈,所以一旦第一个裂缝开始出现,想到 是一个好主意。

+0

但我没有看到任何理由使用破碎的散列函数,有点奇怪,当SHA几乎移动到SHA3时它仍然是默认值。我不认为你有更多的答案,其余的QS?但thnx很多! – Drakoumel

+0

AFAIK SHA-3尚未标准化。我非常想知道,常常半知识和炒作会导致错误的决定(例如,我从一家公司那里听说他们不想使用TLS,因为它存在(理论上的)攻击。我不是安全专家,而是据我记忆,SHA-1是完全安全的使用和安全的,所以没有必要(现在还有可能在不久的将来)使用其他算法。通常安全概念不会中断,并且像这样指向。 – for3st

+2

10 HMAC-SHA1是即使是SHA1,也不会中断,甚至HMAC-MD5也能正常工作,这是因为HMAC受哈希函数冲击的影响要小得多,HMAC只需要哈希函数产生前像抗性,而MD5和SHA1都具有完全的前像抗性。 – ntoskrnl