2016-11-15 142 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密钥进行第二次计算,这就是它们给出不同结果的原因。

至于“哈希函数是确定性的”:它们是。如果你用相同的输入调用它们,它们会给出相同的输出。由于误解了底层算法的工作原理,你给了他们不同的输入。