PBKDF2
PBKDF2 是一种简单的密码学密钥派生函数,可以抵抗字典攻击和彩虹表攻击。它以带有某种填充的多次迭代 HMAC 派生为基础。互联网标准 RFC 2898(PKCS #5)描述了 PBKDF2 算法。
PBKDF2 接受多个输入参数,并输出派生密钥:
key = pbkdf2(password, salt, iterations-count, hash-function, derived-key-len)
从技术上讲,PBKDF2 的输入数据包括:
password——字节数组/字符串,例如“p@$Sw0rD~3”(建议最短长度为 8-10 个字符)salt——安全生成的随机字节,例如“df1f2d3f4d77ac66e9c5a6c3d8f921b6”(至少 64 位,建议 128 位)iterations-count,例如迭代 1024 次- 用于计算 HMAC 的
hash-function,例如SHA256 - 输出的
derived-key-len,例如 32 字节(256 位)
输出数据是指定长度的派生密钥(如 256 位)。
PBKDF2 与迭代次数
PBKDF2 允许配置迭代次数,从而控制派生密钥所需的时间。
- 较慢的密钥派生意味着更长的登录时间/更慢的解密等,同时对密码破解攻击具有更强的抵抗力。
- 较快的密钥派生意味着更短的登录时间/更快的解密等,同时对密码破解攻击的抵抗力更弱。
- PBKDF2 无法抵抗 GPU 攻击(使用显卡并行破解密码)和 ASIC 攻击(使用专用密码破解硬件)。这是开发更现代 KDF 函数的主要动机。
PBKDF2——示例
可在此处在线试用 PBKDF2 密钥派生:https://asecuritysite.com/encryption/PBKDF2z。

尝试增加迭代次数,观察它如何影响密钥派生速度。
在 Python 中计算 PBKDF2——示例
现在编写一些 Python 代码,使用 PBKDF2 算法从密码派生密钥。
首先,使用以下命令安装 Python 包 backports.pbkdf2:
pip install backports.pbkdf2
现在编写用于计算 PBKDF2 的 Python 代码:
import os, binascii
from backports.pbkdf2 import pbkdf2_hmac
salt = binascii.unhexlify('aaef2d3f4d77ac66e9c5a6c3d8f921d1')
passwd = "p@$Sw0rD~1".encode("utf8")
key = pbkdf2_hmac("sha256", passwd, salt, 50000, 32)
print("Derived key:", binascii.hexlify(key))
运行上面的代码示例:https://repl.it/@nakov/PBKDF2-in-Python。
PBKDF2 计算函数接受多个输入参数:HMAC 使用的哈希函数、密码(字节序列)、盐(字节序列)、迭代次数和输出密钥长度(派生密钥的字节数)。
上述代码执行的输出如下:
Derived key: b'52c5efa16e7022859051b1dec28bc65d9696a3005d0f97e506c42843bc3bdbc0'
尝试修改迭代次数,观察执行时间是否以及如何变化。
何时使用 PBKDF2?
如今,PBKDF2 被认为已经过时,安全性也低于现代 KDF 函数,因此建议改用 Bcrypt、Scrypt 或 Argon2。本节后续将详细介绍所有这些 KDF 函数。