Skip to content

PBKDF2Password-Based Key Derivation Function 2)即基于密码的密钥派生函数

该算法主要是基于指定的哈希函数,针对密码、结合给定盐值进行多次迭代,然后生成指定长度的哈希。

PBKDF2 的主要目的是增加密码的强度和安全性。

通过增加盐值和迭代次数,它可以防止彩虹表攻击(一种攻击方式,攻击者事先计算并存储了常见密码的哈希值,以便快速破解密码)。

PBKDF2 的迭代次数越多,计算成本越高,攻击者破解密码的难度也越大。

PBKDF2 的步骤如下:

  1. 接收密码和盐值作为输入。
  2. 将盐值与密码组合在一起。
  3. 使用所选的哈希算法(通常是 SHA-1SHA-256 等)对组合后的数据进行第一次哈希计算。
  4. 将第一次哈希的结果与盐值和密码再次组合在一起。
  5. 再次使用哈希算法对新组合的数据进行哈希计算。
  6. 重复上述过程,进行多次迭代(由迭代次数参数控制),每次都将上一次的哈希结果与盐值和密码组合在一起进行哈希计算。
  7. 最终的哈希结果就是存储在数据库中的密码哈希值或生成的密钥。

PBKDF2 相关的变量有如下几种:

  1. password 目标密码
  2. hasher 指定哈希
  3. salt 给定盐值
  4. iterations 迭代次数
  5. 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 可能不再足够安全,因此一些密码学应用现在更倾向于使用更强大的密码学方案,如 bcryptArgon2