2009-08-28 90 views
2

我剛剛將我的Mac升級到Snow Leopard,並啓動並運行了Rails環境。唯一的區別 - OSX旁邊 - 與我以前的安裝是我現在運行ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0](雪豹默認),而不是1.8.6。如何解決OpenSSL的棄用警告:: Cipher :: Cipher#encrypt

現在我看到有關的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(如果是的話,這樣做的最好方法是什麼?),我應該試着隱藏警告(把我的頭埋在沙中?),還是有一個簡單的解決方法可以在代碼中應用?

回答

3

由於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 
+0

請參見下面的註釋關於調用'decrypt'和'pkcs5_keyivgen'的排序。 – jrdioko 2011-01-21 23:25:07

+0

另請參閱新的[文檔](https://github.com/ruby/ruby/blob/trunk/ext/openssl/ossl.c#L409)。 – jrdioko 2011-01-25 18:10:21

1

ZZ編碼器是接近,但沒有雪茄。實際上,您應該在#decrypt或#encrypt之前調用密碼#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