2016-11-15 52 views
0

所以我目前正在學習Python並且正在學習那種語言的加密方法。在那裏,我從hashlib庫中找到函數pbkdf2_hmac(hash_name,password,salt,iterations,dklen = None)。在基於密碼的密鑰派生函數中迭代2

但是,參數「迭代」不能像我期望的那樣工作。正如下面的簡單代碼所示,當我嘗試使用一次迭代調用函數兩次時,我得到一個不同的答案,然後當我用兩次迭代調用它時。由於散列函數是確定性的,所以兩種方法都應該產生相同的結果。

import hashlib 
a=hashlib.pbkdf2_hmac("sha256",b"hallo",b"salt",1) 
b=hashlib.pbkdf2_hmac("sha256",a,b"salt",1) 
c=hashlib.pbkdf2_hmac("sha256",b"hallo",b"salt",2) 
print(b) 
print(c) 

有人能告訴我出了什麼問題嗎?

回答

1

PBKDF2的第二次迭代不只是PBKDF2(第一次迭代)。

簡化的解釋是:

  • 1次迭代:HMAC(password, salt || 00000001)
  • 2次迭代:HMAC(password, HMAC(password, salt || 00000001))
  • PBKDF2(PBKDF2):HMAC(HMAC(password, salt || 00000001), salt || 00000001)

注意 「2次迭代」 和「 PBKDF2(PBKDF2)「版本使用不同的HMAC密鑰進行第二次計算,這就是它們給出不同結果的原因。

至於「哈希函數是確定性的」:它們是。如果你用相同的輸入調用它們,它們會給出相同的輸出。由於誤解了底層算法的工作原理,你給了他們不同的輸入。