【问题标题】:Why OpenSSL::PKCS5.pbkdf2_hmac_sha1 generates key with different length?为什么 OpenSSL::PKCS5.pbkdf2_hmac_sha1 生成不同长度的密钥?
【发布时间】:2013-10-31 10:11:01
【问题描述】:

我正在使用 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 个字节长)。

有人能知道我做错了什么吗?

【问题讨论】:

    标签: ruby pbkdf2


    【解决方案1】:

    由于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"
    

    【讨论】:

    • 感谢回答!我确实从字符串中删除了尾随 '\n',但它也删除了内部 '\n'。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多