PBKDF2
(Password-Based Key Derivation Function 2
)即基于密码的密钥派生函数。
该算法主要是基于指定的哈希函数,针对密码、结合给定盐值进行多次迭代,然后生成指定长度的哈希。
PBKDF2
的主要目的是增加密码的强度和安全性。
通过增加盐值和迭代次数,它可以防止彩虹表攻击(一种攻击方式,攻击者事先计算并存储了常见密码的哈希值,以便快速破解密码)。
PBKDF2
的迭代次数越多,计算成本越高,攻击者破解密码的难度也越大。
PBKDF2
的步骤如下:
- 接收密码和盐值作为输入。
- 将盐值与密码组合在一起。
- 使用所选的哈希算法(通常是
SHA-1
、SHA-256
等)对组合后的数据进行第一次哈希计算。 - 将第一次哈希的结果与盐值和密码再次组合在一起。
- 再次使用哈希算法对新组合的数据进行哈希计算。
- 重复上述过程,进行多次迭代(由迭代次数参数控制),每次都将上一次的哈希结果与盐值和密码组合在一起进行哈希计算。
- 最终的哈希结果就是存储在数据库中的密码哈希值或生成的密钥。
PBKDF2
相关的变量有如下几种:
password
目标密码hasher
指定哈希salt
给定盐值iterations
迭代次数keySize
长度
在 crypto-js
中的,默认的配置为:
js
CryptoJS.PBKDF2(password, salt, {
keySize: 128 / 32,
hasher: SHA1,
iterations: 1
})
js
const CryptoJS = require('crypto-js')
const salt = CryptoJS.lib.WordArray.random(128 / 8)
const key128Bits = CryptoJS.PBKDF2('Secret Passphrase', salt, {
keySize: 128 / 32
})
const key256Bits = CryptoJS.PBKDF2('Secret Passphrase', salt, {
keySize: 256 / 32
})
const key512Bits = CryptoJS.PBKDF2('Secret Passphrase', salt, {
keySize: 512 / 32
})
const key512Bits1000Iterations = CryptoJS.PBKDF2('Secret Passphrase', salt, {
keySize: 512 / 32,
iterations: 1000
})
const key512Bits1000IterationsAndSha256 = CryptoJS.PBKDF2('Secret Passphrase', salt, {
hasher: CryptoJS.algo.SHA256,
keySize: 512 / 32,
iterations: 1000
})
TIP
PBKDF2
广泛用于存储用户密码的安全性,以及生成用于加密和认证的密钥,特别是在需要高度安全性的应用中,如身份验证和数据加密。
然而,需要注意的是,随着计算能力的增加,PBKDF2
可能不再足够安全,因此一些密码学应用现在更倾向于使用更强大的密码学方案,如 bcrypt
和 Argon2
。