webentwicklung-frage-antwort-db.com.de

Fehler "cipher.key" von Rails 5 "Schlüssel muss 32 Byte sein"

Brandneue Rails-Anwendung.

Rails-Version 5.0.0.1, Ruby-Version 2.4.0preview2.

Erstellen Sie die Anwendung "Demo", führen Sie ein einfaches Scaffold-Generierungsprodukt aus und erhalten Sie eine Fehlermeldung, wenn Sie versuchen, die Übersichtsseite des Scaffolds anzuzeigen (die Basisindexdatei lädt immer noch die Anzeige "Willkommen bei Rails"):

ArgumentError in ProductController # index - Schlüssel muss 32 Byte sein:

  cipher = new_cipher
  cipher.encrypt
  cipher.key = @secret

  # Rely on OpenSSL for the initialization vector
  iv = cipher.random_iv

Die Problemzeile lautet anscheinend cipher.key = @secret.

Ich habe im Github-Repo für Rails verschiedene Erwähnungen gesehen, in denen dieses Problem erwähnt wurde, aber alle implizierten, dass es nun in Rails 5.0.0.1 gelöst wurde

9

Ok, es gab ein leichtes Missverständnis von meiner Seite, es sieht so aus, als ob der Fix in 5.0.1 und nicht in 5.0.0.1 erscheint

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

3

versuche dies:

rake db:create
rake db:migrate

dann das Wichtigste:

bundle update

Das funktioniert für mich. 

2
Naomi Wu

Endlich Problem gefunden! Es war von einem Bugfix ... https://bugs.Ruby-lang.org/issues/12561

Wenn Sie eine Chiffre verwenden, z. 'aes-256-cfb', der key_len ist 32, gefunden von:

require 'openssl'
cipher = OpenSSL::Cipher.new('aes-256-cfb')
cipher.key_len # => 32

Wir hatten fälschlicherweise gedacht, dass wir eine Nonce mit 256 Zeichen senden müssten, aber eigentlich sollten Sie eine Nonce mit 32 Zeichen senden - oder Use cipher.random_key (die intern den key_len verwendet). Es war nie ein Problem, weil openssl die Nonce abgeschnitten hat ... aber jetzt müssen Sie die Nonce mit der richtigen Länge senden.

Wir haben diesen Fehler beim Upgrade von Ruby von 2.3.4 auf 2.4.2 erhalten.

2
xxjjnn

Lösung

  1. Bearbeiten Sie Ihr Gemfile
  2. Fügen Sie die folgende Zeile hinzu: gem 'Rails', '~> 5.0.0', '> = 5.0.0.1'
  3. bundle installieren
  4. Optional: Ich verwende Ruby2-4.1. (rvm installiere Ruby-2.4.1)

Rational : Die Rails-Version vor 5.0.0 scheint einen Fehler zu haben, der dieses Problem verursacht. Der Fehler wurde in der neuesten Version von Rails behoben. Wenn Sie sich nicht an das Rails-Installationshandbuch ( http://railsapps.github.io/installrubyonrails-mac.html ) halten, werden Sie wahrscheinlich an diesem Datum der Veröffentlichung auf dieses Problem stoßen.

Dieser Fix funktioniert und wird von überprüft 

1
FlyingV

Verwenden Sie random_key, damit es immer passt.

key = cipher.random_key
cipher.key = key

referenz http://Ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/Cipher.html

1
Bater

Hatte den gleichen Fehler: Das Ausführen eines Bundle-Updates sollte den Trick ausführen

0
Ahmed J.

Es stellt sich heraus, dass dieses Problem mit dem von Ihnen verwendeten Schlüssel verbunden ist. Ohne Ihren Schlüssel zu ändern, können Sie den folgenden Code verwenden, um Ihren Schlüssel in 32 Bytes umzuwandeln:

attr_encrypted: Attribut, Schlüssel: ENV ['MY_KEY']. Bytes [0..31] .pack ("c" * 32)

0
Chris

Bitte benutzen Sie Digest :: MD5 um 32 Bytes zu erhalten

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",""

Oder verwenden Sie einfach geheimer Schlüssel mit einer Länge von 32 Byte

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
0
Govind shaw

Ich hatte auch dieses Problem und löste es durch Laufen

bundle update

Stellen Sie sicher, dass Sie die neueste Version von Rails installiert haben.

0
DVislearning