Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何解决OpenSSL::Cipher::Cipher#encrypt的弃用警告_Ruby On Rails_Ruby_Encryption_Osx Snow Leopard_Openssl - Fatal编程技术网

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

Ruby on rails 如何解决OpenSSL::Cipher::Cipher#encrypt的弃用警告,ruby-on-rails,ruby,encryption,osx-snow-leopard,openssl,Ruby On Rails,Ruby,Encryption,Osx Snow Leopard,Openssl,我刚刚将我的Mac升级到Snow Leopard,并启动并运行了Rails环境。除了OSX之外,我与以前安装的唯一不同之处在于,我现在运行的是ruby 1.8.7(2008-08-11 patchlevel 72)[universal-darwin10.0](雪豹默认)而不是1.8.6 我现在在运行代码时看到与OpenSSL相关的弃用警告: 警告:不推荐使用OpenSSL::Cipher::Cipher#encrypt和OpenSSL::Cipher::Cipher#decrypt的参数;使用O

我刚刚将我的Mac升级到Snow Leopard,并启动并运行了Rails环境。除了OSX之外,我与以前安装的唯一不同之处在于,我现在运行的是
ruby 1.8.7(2008-08-11 patchlevel 72)[universal-darwin10.0]
(雪豹默认)而不是1.8.6

我现在在运行代码时看到与OpenSSL相关的弃用警告:

警告:不推荐使用OpenSSL::Cipher::Cipher#encrypt和OpenSSL::Cipher::Cipher#decrypt的参数;使用OpenSSL::Cipher::Cipher#pkcs5u keyivgen派生密钥和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
1。def解密(数据)
2.encryptor=OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC'))
3.key=“我的钥匙”
4.加密程序。解密(密钥)
5.text=加密程序。更新(数据)

6.text由于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
put”--加密--”
des=OpenSSL::Cipher::Cipher.new(alg)
des.pkcs5_keyivgen(通过,盐)
des.encrypt
密码=des.update(文本)

密码ZZ编码器很接近,但没有雪茄。事实上,在“解密”或“加密”之前,您不应该调用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
put”--加密--”
des=OpenSSL::Cipher::Cipher.new(alg)
des.encrypt
des.pkcs5_keyivgen(通过,盐)
密码=des.update(文本)

密码请参见下面关于调用
解密
pkcs5_keyivgen
的顺序的说明。另请参见新的。
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