Ошибка ключа Rails 5 cipher.key "должна быть 32 байта"

Новое приложение 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

Ответ 1

Хорошо, с моей стороны было небольшое недоразумение, похоже, исправление будет в 5.0.1, а не 5.0.0.1

https://github.com/rails/rails/issues/26694

Ответ 2

Наконец-то найдена проблема! Это было из исправления... 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.

Ответ 3

попробуйте следующее:

rake db:create
rake db:migrate

то самое главное:

bundle update

Это работает для меня.

Ответ 5

Решение:

  • Отредактируйте свой Gemfile
  • Добавьте следующую строку: gem 'rails', '~ > 5.0.0', ' >= 5.0.0.1'
  • установить пакет
  • Дополнительно: я использую ruby2-4.1. (rvm install ruby-2.4.1)

Rational: версия rails до 5.0.0, похоже, содержит ошибку, которая вызывает эту проблему. Ошибка была решена в последней версии Rails. Если вы заявляете, что следуете руководству по установке Rails (http://railsapps.github.io/installrubyonrails-mac.html), вы, вероятно, столкнетесь с этой проблемой на этой дате публикации.

Это исправление работает и проверяется

Ответ 6

У меня тоже была эта проблема, и я исправил ее, запустив

bundle update

Убедитесь, что установлена ​​последняя версия рельсов.

Ответ 7

Произошла та же ошибка: запуск обновления пакета должен помочь

Ответ 8

Пожалуйста, используйте 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

Ответ 9

Эта проблема оказывается связана с ключом, который вы используете. Не меняя ключ, вы можете использовать приведенный ниже код для преобразования ключа в 32 байта:

attr_encrypted :attribute, key: ENV['MY_KEY'].bytes[0..31].pack( "c" * 32 )