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 次
  • 用于计算 HMAChash-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 函数,因此建议改用 BcryptScryptArgon2。本节后续将详细介绍所有这些 KDF 函数。

results matching ""

    No results matching ""