【问题标题】:How to resolve deprecation warnings for OpenSSL::Cipher::Cipher#encrypt如何解决 OpenSSL::Cipher::Cipher#encrypt 的弃用警告
【发布时间】:2010-11-23 21:05:33
【问题描述】:

我刚刚将我的 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(如果是,最好的方法是什么?),我应该尝试隐藏警告(把我的头埋在沙子里?!)还是有一个简单的解决方法?可以在代码中申请吗?

【问题讨论】:

    标签: ruby-on-rails ruby encryption osx-snow-leopard openssl


    【解决方案1】:

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

    【讨论】:

    • 请参阅下面有关对decryptpkcs5_keyivgen 的调用顺序的注释。
    • 另见新的documentation
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-20
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2013-01-11
      • 2020-01-07
      相关资源
      最近更新 更多