模块 OpenSSL::KDF

提供各种 KDF(密钥派生函数)的功能。

KDF 通常用于安全地从密码派生任意长度的对称密钥,以与 OpenSSL::Cipher 一起使用。 另一种用例是用于存储密码:由于可以通过增加迭代次数来调整计算的强度,因此可以人为地减慢计算速度,以使可能的攻击变得不可行。

目前,OpenSSL::KDF 提供了以下 KDF 的实现

示例

Cipher(例如 AES)生成 128 位密钥

pass = "secret"
salt = OpenSSL::Random.random_bytes(16)
iter = 20_000
key_len = 16
key = OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
                               length: key_len, hash: "sha1")

存储密码

pass = "secret"
# store this with the generated value
salt = OpenSSL::Random.random_bytes(16)
iter = 20_000
hash = OpenSSL::Digest.new('SHA256')
len = hash.digest_length
# the final value to be stored
value = OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
                                 length: len, hash: hash)

关于检查密码的重要提示

当比较用户提供的密码与之前存储的值时,一个常见的错误是使用 “==” 比较这两个值。 通常,“==” 在评估时会短路,因此容易受到计时攻击。 正确的方法是使用一种在比较两个值时始终花费相同时间的方法,从而不会向潜在的攻击者泄露任何信息。 为此,请使用 OpenSSL.fixed_length_secure_compare