首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决OpenSSL::Cipher::Cipher#encrypt的弃用警告

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

Stack Overflow用户
提问于 2009-08-28 21:13:24
回答 2查看 10.6K关注 0票数 2

我刚刚将我的Mac升级到Snow Leopard,并启动并运行了我的Rails环境。与我之前安装的唯一不同之处在于,我现在运行的是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行导致了这些警告(它解码了一个加密的字符串):

代码语言:javascript
复制
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 (如果是,最好的方法是什么?),是否应该尝试隐藏警告(将我的头埋在沙子里?)或者我可以在代码中应用一个简单的修复方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-29 00:07:22

由于Ruby中的隐式类型转换,较旧的Ruby允许人们以完全错误的方式使用PBE (基于密码的加密)。较新的版本修复了这一点,因此警告是一件好事。

您的示例正好说明了问题所在。Triple-DES需要24字节的密钥材料(包括奇偶校验),但您只提供了6字节。您的密钥材料将重复,以弥补赤字,这导致较不安全的密钥。

正确的方法是使用PKCS5生成密钥和IV (初始向量),这使用了复杂的散列和迭代来使密钥更加安全。

Ruby提供了以下示例代码。pass是您的密钥,您可以对salt使用任何硬编码值。

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2010-04-03 10:04:40

ZZ Coder很接近,但没有雪茄。事实上,你永远不应该在#decrypt或#encrypt之前调用Cipher#pkcs5_keyivgen。在实践中,它通常可以很好地加密,但解密将经常失败。所以代码应该是:

代码语言:javascript
复制
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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1349397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档