我刚刚将Mac升级到Snow Leopard并启动并运行了我的Rails环境。唯一的区别 - OSX除了 - 我以前的安装是我现在运行ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]
(Snow Leopard默认值)而不是1.8.6。
我现在在运行代码时看到与OpenSSL相关的弃用警告:
warning: argumtents for OpenSSL::Cipher::Cipher#encrypt and OpenSSL::Cipher::Cipher#decrypt were deprecated; use OpenSSL::Cipher::Cipher#pkcs5_keyivgen to derive key and IV
我在第4行引起这些警告(它解码加密字符串)的代码示例:
1. def decrypt(data)
2. encryptor = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC')
3. key = "my key"
4. encryptor.decrypt(key)
5. text = encryptor.update(data)
6. text << encryptor.final
7. end
我很难理解如何解决这个问题,Google并没有真正帮助我。我是否应该尝试降级到Ruby 1.8.6(如果是这样,最好的方法是什么?),我应该尝试隐藏警告(把我的头埋在沙子里?)或者是否有一个简单的解决方法我可以在代码中申请吗?
答案 0 :(得分:3)
由于Ruby中的隐式类型转换,较旧的Ruby允许人们以完全错误的方式使用PBE(基于密码的加密)。较新的一个修复了所以警告是一件好事。
您的示例显示了问题所在。 Triple-DES需要24字节密钥材料(包括奇偶校验),但您只提供6个字节。将重复您的关键材料以弥补赤字,从而导致密钥安全性降低。
正确的方法是使用PKCS5生成密钥和IV(初始向量),它使用复杂的散列和迭代来使密钥更加安全。
Ruby提供以下示例代码。 pass
是您的密钥,您可以使用salt
的任何硬编码值。
puts "--Encrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.pkcs5_keyivgen(pass, salt)
des.encrypt
cipher = des.update(text)
cipher << des.final
puts %(encrypted text: #{cipher.inspect})
puts
puts "--Decrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.pkcs5_keyivgen(pass, salt)
des.decrypt
out = des.update(cipher)
out << des.final
puts %(decrypted text: "#{out}")
puts
答案 1 :(得分:1)
ZZ Coder很近,但没有雪茄。事实上,你应该从不在#decrypt或#encrypt之前调用Cipher#pkcs5_keyivgen。在实践中,通常它会加密很好,但解密将经常失败。所以代码应该是:
puts "--Encrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.encrypt
des.pkcs5_keyivgen(pass, salt)
cipher = des.update(text)
cipher << des.final
puts %(encrypted text: #{cipher.inspect})
puts
和
puts "--Decrypting--"
des = OpenSSL::Cipher::Cipher.new(alg)
des.decrypt
des.pkcs5_keyivgen(pass, salt)
out = des.update(cipher)
out << des.final
puts %(decrypted text: "#{out}")
puts