基于密码的密钥推导函数2的迭代

Iteration in password-based Key derivation function 2

所以我目前正在学习 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)

谁能告诉我哪里出了问题?

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 密钥,这就是它们给出不同结果的原因。

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