我过去一年在我的应用程序中使用了以下代码,使用此代码有200k记录:
options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" }
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
cipher.send(:encrypt)
cipher.pkcs5_keyivgen(options[:key])
result = cipher.update(options[:value])
result << cipher.final
# => "x\xED\x14s\xFD\x0E\x97\xC5\x996[M\x1E\x94\xDEI"
我需要(按业务)重构pkcs5_keyivgen
部分,以便正确执行:例如,
options = { :algorithm => 'aes-256-cbc', :value => "changethis", :key => "secretkey" }
cipher = OpenSSL::Cipher::Cipher.new(options[:algorithm])
cipher.send(:encrypt)
cipher.key = '' # ??? 1) How does pkcs5_keyivgen in above code generate key, or does it just use my options[:key]
cipher.iv = '' # ??? 2) How does pkcs5_keyivgen in above code generate iv
result = cipher.update(options[:value])
result << cipher.final
我必须弄清楚pkcs5_keyivgen
如何设置key
和iv
。想法在这里?我们使用ruby-1.9.3-p286和encryptor-1.1.3
我看到了this question和this question,但他们没有帮我解决问题。
答案 0 :(得分:3)
试图解决这个问题,但我认为没有简单的解决方案,或者我只是看不到一个问题。不推荐使用Pkcs5_keyivgen()
,并为AES 256实现非标准密钥传递。
来自此docs和此source code
Pkcs5_keyivgen (pass, SALT = nil, num = 2048, digest = "MD5") -> nil
从salt生成一些键和IV并传递。在你的情况下没有盐。生成方法在v1.5 PKCS #5
(不建议使用)
所以你正在寻找&#34;基于密码的密钥衍生功能&#34;。 PBKDF1
来自Openssl的 Pkcs5_keyivgen()
函数调用EVP_BytesToKey()
和EVP_BytesToKey()
生成non-standard way
因此MD5为MD5生成大小为EVP_MAX_MD_SIZE (16 + 20)
// 16的哈希
但AES key(32) + IV(16) sizes > EVP_MAX_MD_SIZE
,因此AES 256将需要多个哈希来生成随机密钥和IV。这是C
这里EVP_BytesToKey()
如果你真的想重新实施PBKDF1,这里也是RTC2898 standard for PBKDF1 但我不认为自己实施加密是个好主意