我刚刚将 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)