【问题标题】:Iteration in password-based Key derivation function 2基于密码的密钥派生函数2中的迭代
【发布时间】:2017-03-29 08:35:15
【问题描述】:

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

但是,参数“迭代”并没有像我预期的那样工作。如以下简单代码所示,当我尝试通过一次迭代调用该函数两次时,我得到的答案与当我通过两次迭代调用一次时不同。由于散列函数是确定性的,因此两种方法都应该产生相同的结果。

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)

谁能告诉我出了什么问题?

【问题讨论】:

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


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

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

    【讨论】:

      猜你喜欢
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2012-06-24
      • 2012-05-02
      相关资源
      最近更新 更多