KDF:从密码派生密钥
下面详细说明如何安全地从密码派生密钥,并介绍实践中最常用的密钥派生函数(KDF):PBKDF2、Bcrypt、Scrypt 和 Argon2。
[待办:说明 Linux crypt:SHA-512 密钥派生]
我们将讨论上述 KDF 的优缺点以及适用场景。
密钥派生函数——概念
在密码学中,我们经常使用密码代替二进制密钥,因为密码更容易记忆和记录,也可以更短。
当某种算法需要密钥(例如用于加密或数字签名)时,就需要使用密钥派生函数(密码 -> 密钥)。
前面已经指出,使用 SHA-256(password) 进行密钥派生并不安全!它容易遭受多种攻击:暴力破解、字典攻击、彩虹表攻击等。这些攻击在实践中可能逆向还原哈希,使攻击者获得密码。
密码学密钥派生函数
PBKDF2、Bcrypt、Scrypt 和 Argon2 是强度高得多的密钥派生函数,旨在抵抗密码猜测(暴力破解)攻击。
按照设计,安全密钥派生函数会使用盐(每次密钥派生都不同的随机数)+ 大量迭代(减慢潜在的密码猜测过程)。这一过程称为密钥拉伸。
计算安全 KDF 需要一定的 CPU 时间来派生密钥(如 0.2 秒),并占用一定的内存(RAM)。因此,密钥派生的“计算成本较高”,密码破解的计算成本也会随之提高。
如果为现代 KDF 函数使用合适的配置参数,密码破解将变得缓慢(例如每秒尝试 5-10 次,而不是数千或数百万次)。
上述所有密钥派生算法(PBKDF2、Bcrypt、Scrypt 和 Argon2)均未申请专利,可免版税公开使用。
下面进一步了解这些现代 KDF。