2013-10-22 67 views
0

我用Rails 3.2,並試圖生成pbkdf2_hmac_sha1功能,以加密的東西使用AES-CBC密鑰和IV 256爲什麼OpenSSL :: PKCS5.pbkdf2_hmac_sha1生成不同長度的密鑰?

我用它來生成它的代碼是:

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

由於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" 
+0

感謝回答! 我真的刪除了字符串尾部的'\ n',但它也刪除了內部'\ n'。 – MarcosCunhaLima

相關問題