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

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


是我们提供所需SHA的变体的关键吗?像SHA-256,512等?

HMAC又如何改变输出?

最后,当SHA1损坏时,它是否足够坚固?

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

最佳答案

是我们提供所需SHA的变体的关键吗?像SHA-256,512等?


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


对于SHA-1,这是160位(20字节)
对于SHA-256,则为256位(32字节)等。
这样做的原因是,如果您要求的散列(密钥)比散列函数支持的更长,则第一个本机长度是相同的,因此攻击者只需攻击位。这是1Password在Hashcat团队找到它时发现并解决的问题。


举例说明:

这是价值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个字节。


是的,您是正确的; 21字节的时间是PBKDF2-HMAC-SHA-1的20倍,而40字节的时间实际上只有21字节。但是,因为41/20在2到3之间(不包括在内),所以41个字节的时间是20字节的三倍。



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;这是您看到的权衡并没有任何魔术的地方)。”

关于hash - 加密-Express.js是否足以用于PBKDF2 HMAC-SHA1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21229685/

10-11 18:46