2013-01-18 42 views
4

如果節點的crypto.PBKDF2使用HMAC SHA-1,那麼密鑰長度如何能超過20個字節?使用HMAC SHA-1的PBKDF2如何返回超過20個字節?

下面是我的理解(顯然不正確):crypto.PBKDF2(password, salt, iterations, keylen, callback)使用HMAC SHA-1來用鹽散列密碼。然後它用相同的鹽進行散列和散列化處理。它會重複這一點,無論你多次重複,你都會告訴它,然後將結果傳回給你。結果將被截斷爲您在keylen中指定的字節數。

SHA-1 outputs 160 bits或20個字節。但是,我可以要求keylencrypto.PBKDF2超過20個字節,並且過去的第20個字節,數據不會重複。這對我來說沒有意義。

我在這裏誤解了什麼?

試試看:

c.pbkdf2('password', 'salt', 1, 21, function(err, key) { 
    for (var i = 0; i < key.length; i++) { 
     console.log(key[i].toString(36)); 
    } 
}); 

我希望看到某種模式的20字節後,但是​​我沒有。

回答

6

要導出i th塊,PBKDF2將運行全密鑰推導,並將i連接到salt。所以爲了得到你的第21個字節,它只是再次運行派生,使用不同的有效鹽,導致完全不同的輸出。這意味着導出21個字節的費用是導出20個字節的兩倍。


我建議不要使用PBKDF2派生超過基本散列的自然輸出大小/大小。通常這隻會減慢防守者,而不是攻擊者。

我寧願運行PBKDF2一次來派生一個主密鑰,然後使用HKDF從它派生多個祕密。請參閱How to salt PBKDF2, when generating both an AES key and a HMAC key for Encrypt then MAC? on crypto.SE

+0

有趣的帖子,目前爲Bouncy實施HKDF –

+0

請注意,我完全同意您對使用PBKDF2更大尺寸輸出的評估。就我個人而言,我認爲這是足夠的理由來考慮創建一個PBKDF3或類似的東西,爲PBE構造創建更長的OKM(輸出密鑰材料)。 KDF在密碼世界中受到的關注很少。就我個人而言,我已經將KDF2與PBKDF2結合在一起,但由於HKDF更安全,所以這肯定是首選。大衛已經接受我的執行意思:) –

+0

@owlstead相關的郵件列表:[crypt-dev](http://www.openwall.com/lists/crypt-dev) – CodesInChaos