为什么OpenSSL :: PKCS5.pbkdf2_hmac_sha1生成不同长度的密钥?

时间:2013-10-22 13:40:16

标签: ruby pbkdf2

我正在使用Rails 3.2并尝试从 pbkdf2_hmac_sha1 函数生成密钥和IV,以便使用AES-CBC 256加密。

我用来生成它的代码是:

require "openssl"
require "base64"
require "digest"
require "securerandom"

@chave = "fd5d148867091d7595c388ac0dc50bb465052b764c4db8b4b4c3448b52ee0b33df16975830acca82"

cipher = OpenSSL::Cipher.new("AES-256-CBC")
key_iv = OpenSSL::PKCS5.pbkdf2_hmac_sha1(@chave, salt, 2000, cipher.key_len+cipher.iv_len)
key = key_iv[0, cipher.key_len]
iv  = key_iv[cipher.key_len, cipher.iv_len]

我使用SecureRandom.urlsafe_base64生成一个随机盐,并注意到当我使用一些盐时,有时IV长度(应该是16个字节)是15个字节而不是16个字节。

例如,如果你有一个salt =“lzbH78AwVK7U1eo-ephK6A”,它会生成一个IV =“604ff394b52e79255fa35b081684b0”(15个字节长)。

有人能够弄清楚我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

由于pbkdf2_hmac_sha1产生一个字符串,似乎你转换为十六进制数是错误的。 (在此示例中使用您的值):

irb(main):029:0> iv  = key_iv[cipher.key_len, cipher.iv_len]
=> "`O\xF3\x94\n\xB5.y%_\xA3[\b\x16\x84\xB0"
irb(main):030:0> iv.length
=> 16
irb(main):032:0> iv.each_char { |c| puts c.ord.to_s(16) }
60
4f
f3
94
a     ### this one is missing in your number -- it maps to \n
b5
2e
79
25
5f
a3
5b
8
16
84
b0
=> "`O\xF3\x94\n\xB5.y%_\xA3[\b\x16\x84\xB0"