Как разрешить предупреждения об устаревании для OpenSSL :: Cipher :: Cipher # encrypt - PullRequest
2 голосов
/ 29 августа 2009

Я только что обновил свой 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 (и если да, то как лучше это сделать?), Я должен попытаться просто скрыть предупреждения (похоронить мою голову в песке ?!) или есть простое исправление? можно применить в коде?

Ответы [ 2 ]

3 голосов
/ 29 августа 2009

Из-за неявного преобразования типов в Ruby, старый Ruby позволяет людям использовать PBE (шифрование на основе пароля) совершенно неверным способом. Более новый исправляет это, так что предупреждение - хорошая вещь.

Ваш пример показывает точно проблему. Triple-DES требует 24-байтового ключевого материала (включая четность), но вы предоставили только 6 байтов. Ваш ключевой материал будет повторен, чтобы восполнить дефицит, что привело к менее надежному ключу.

Правильный способ сделать это - сгенерировать ключ и IV (начальный вектор) с PKCS5, которые используют сложное хеширование и итерацию, чтобы сделать ключ намного более безопасным.

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
1 голос
/ 03 апреля 2010

З.З. Кодер был рядом, но без сигары. Фактически, вы должны никогда не вызывать Cipher # pkcs5_keyivgen перед #decrypt или #encrypt. На практике, как правило, он будет нормально шифроваться, но дешифрование часто будет неудачным. Поэтому код должен быть:

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
...