基于密码的密钥派生函数2的迭代

时间:2016-11-15 12:47:08

标签: python python-3.x salt pbkdf2 hashlib

所以我正在学习Python,并且正在学习该语言的加密方法。在那里我从hashlib库中找到了函数pbkdf2_hmac(hash_name,password,salt,iterations,dklen = None)。

但是,参数“iterations”不能像我期望的那样工作。如下面的简单代码所示,当我尝试使用一次迭代调用该函数两次时,我得到一个不同的答案然后当我用两次迭代调用它一次。由于散列函数是确定性的,因此两种方法都应该产生相同的结果。

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 个答案:

答案 0 :(得分: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密钥进行第二次计算,这就是他们给出不同结果的原因。

就“散列函数是确定性的”而言:它们是。如果用相同的输入调用它们,它们会提供相同的输出。由于误解了基础算法的工作原理,你给了他们不同的输入。