我刚刚把我的mac升级到雪豹,并启动了rails环境。除了OSX之外,我以前的安装唯一的不同之处在于我现在运行的是ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0](SnowLeopard默认值)而不是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

我很难理解我是如何解决这个问题的,而谷歌并没有真正的帮助。我是否应该尝试降级到Ruby1.8.6(如果是,那么最好的方法是什么?),我应该试着把警告藏起来(把头埋在沙子里)吗?!)或者我可以在代码中应用一个简单的修复程序吗?

最佳答案

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

关于ruby-on-rails - 如何解决OpenSSL::Cipher::Cipher#encrypt的弃用警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1349397/

10-11 17:36