是我們提供我們想要的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;這就是你看到這種折衷沒有什麼魔力的地方)。「
只是不要使用超過20個字節的keylen。 – CodesInChaos
PBKDF2相對於其他密碼哈希的缺點,比如bcrypt或scrypt比SHA-256在這方面的缺點要大得多。 – CodesInChaos