Как устранить предупреждения об устаревании для OpenSSL :: Cipher :: Cipher # encrypt

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


person Olly    schedule 28.08.2009    source источник


Ответы (2)


Из-за неявного преобразования типов в 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
person ZZ Coder    schedule 29.08.2009
comment
См. Примечание ниже о порядке вызовов decrypt и pkcs5_keyivgen. - person jrdioko; 22.01.2011
comment
См. Также новую документацию. - person jrdioko; 25.01.2011

ZZ Coder был близок, но без сигары. Фактически, вы не должны никогда вызывать 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
person stderr    schedule 03.04.2010