在基于密码的密钥派生函数中迭代2
问题描述:
所以我目前正在学习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)
有人能告诉我出了什么问题吗?
答
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密钥进行第二次计算,这就是它们给出不同结果的原因。
至于“哈希函数是确定性的”:它们是。如果你用相同的输入调用它们,它们会给出相同的输出。由于误解了底层算法的工作原理,你给了他们不同的输入。