如何解决OpenSSL :: Cipher :: Cipher#encrypt的弃用警告

我刚刚将我的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 

我很难理解如何解决这个问题,谷歌并没有真正帮助我。 我应该尝试降级到Ruby 1.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 

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