Ответ 1
Хорошо, с моей стороны было небольшое недоразумение, похоже, исправление будет в 5.0.1, а не 5.0.0.1
Новое приложение Rails.
Rails версия 5.0.0.1, версия Ruby 2.4.0preview2.
Создайте приложение "demo", запустите простой файл для создания файла и получите ошибку при попытке просмотреть страницу обзора эшафотов (файл базового индекса по-прежнему загружает экран Welcome to Rails):
АргументError в ProductsController # index ключ должен быть 32 байта:
cipher = new_cipher
cipher.encrypt
cipher.key = @secret
# Rely on OpenSSL for the initialization vector
iv = cipher.random_iv
Проблемная строка, по-видимому, является cipher.key = @secret.
Я видел различные упоминания о github repo для Rails, которые упоминают эту проблему, но все подразумевали, что теперь она разрешена в Rails 5.0.0.1
Хорошо, с моей стороны было небольшое недоразумение, похоже, исправление будет в 5.0.1, а не 5.0.0.1
Наконец-то найдена проблема! Это было из исправления... https://bugs.ruby-lang.org/issues/12561
Если вы используете шифр, например. 'aes-256-cfb', key_len
- 32, найденный по:
require 'openssl'
cipher = OpenSSL::Cipher.new('aes-256-cfb')
cipher.key_len # => 32
Мы по ошибке подумали, что нам нужно отправить 256 символов nonce, но на самом деле вы должны отправить 32 символа nonce - или
используйте cipher.random_key
(который внутренне использует key_len
). Это никогда не было проблемой, потому что openssl урезал nonce... но теперь вам нужно отправить правое удлиненное nonce.
Мы получили эту ошибку при обновлении ruby от 2.3.4 до 2.4.2.
попробуйте следующее:
rake db:create
rake db:migrate
то самое главное:
bundle update
Это работает для меня.
Используйте random_key
, чтобы он всегда соответствовал.
key = cipher.random_key
cipher.key = key
ссылка http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html
Решение:
Rational: версия rails до 5.0.0, похоже, содержит ошибку, которая вызывает эту проблему. Ошибка была решена в последней версии Rails. Если вы заявляете, что следуете руководству по установке Rails (http://railsapps.github.io/installrubyonrails-mac.html), вы, вероятно, столкнетесь с этой проблемой на этой дате публикации.
Это исправление работает и проверяется
У меня тоже была эта проблема, и я исправил ее, запустив
bundle update
Убедитесь, что установлена последняя версия рельсов.
Произошла та же ошибка: запуск обновления пакета должен помочь
Пожалуйста, используйте Digest :: MD5 для достижения 32 байтов
require 'openssl'
require 'digest'
require 'base64'
data = "encrypt me"
secret_key = "asd3dssdf34HDas"
c = OpenSSL::Cipher.new("aes-256-cbc")
c.encrypt
c.key = Digest::MD5.hexdigest(secret_key) # this will convert key length into 32
encrypted_data = c.update(data.to_s) + c.final
encrypted_data = Base64.urlsafe_encode64(encrypted_data, padding: false) #padding: false will remove '/', '+' from encrypted data
encrypted_data.gsub! "\n",""
Или просто используйте секретный ключ длиной 32 байта
data = "encrypt me"
secret_key = "Aswertyuioasdfghjkqwertyuiqwerty"
c = OpenSSL::Cipher.new("aes-256-cbc")
c.encrypt
c.key = secret_key
encrypted_data = c.update(data.to_s) + c.final
Эта проблема оказывается связана с ключом, который вы используете. Не меняя ключ, вы можете использовать приведенный ниже код для преобразования ключа в 32 байта:
attr_encrypted :attribute, key: ENV['MY_KEY'].bytes[0..31].pack( "c" * 32 )