5

Ich möchte ein Modell testen, die attr_encrypted ein Geheimnis in der Datenbank zu verschlüsseln verwendetWie verwenden Sie Leuchten mit attr_encrypted

class Thing 
    attr_encrypted :secret, encode: true 
end 

Aber wenn ich das Geheimnis in einer Befestigung der codierten Newline-Zeichen aus wird entkam definieren.

one: 
    encrypted_secret: '<%= Thing.encrypt_secret(SecureRandom.uuid) %>' 

Das heißt:

'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC\nm6qD\n' 

in der Datenbank gespeichert, wie:

'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC 
m6qD' 

Das Problem dabei ist, dass diese dann versagt:

thing = things(:one) 
assert_equal thing, Thing.find_by_secret(thing.secret) 

Sache. find_by_secret (thing.secret) gibt nil becau zurück Die resultierende SQL-Abfrage versucht, den beiden Versionen des verschlüsselten Geheimnisses zu entsprechen und keine Übereinstimmung zu erhalten.

Ich habe versucht:

one: 
    encrypted_secret: 'axZFZEknxUSYdUlPhwLBbj8CwSeCW5at2INA98EcCcY7MVFdmXvk7Sb4DZhC\nm6qD\n' 

aber das gleiche Ergebnis.

Wie kann ich meine Fixtures so konfigurieren, dass sie mit attr_encrypted funktionieren?

Antwort

0

Eine Lösung, die funktioniert, ist, alle '\ n' durch '\\ n' zu ersetzen und doppelte Anführungszeichen zu verwenden. Das funktioniert:

one: 
    encryped_secret: "<%= Thing.encrypt_secret(SecureRandom.uuid).gsub(/\n/, '\\\\n') %>" 

Gibt es einen saubereren Weg, dies zu tun?

0

Ich sah die gleiche Situation unter Rails4 + attr_encrypted + Fixture + Minitest Umgebung, und hier ist meine Problemumgehung.

Zusammenfassend ich die folgenden Schritte hatte:

  1. Schreib Ebene (= unverschlüsselt) Prüfvorrichtung mit einer bestimmten Dateierweiterung (in meinem Fall ist es * .yml.noenc).
  2. Schreiben Rake-Task, um von der einfachen Fixture (.yml.noenc) in verschlüsselte Fixture ( .yml) zu konvertieren.

Lassen Sie mich das Detail unten erklären.

Zum Beispiel: „Message“ Modell hat zwei Attribute ‚Name‘ und ‚Körper‘, die verschlüsselt sind, benötigt werden, wie folgt:

class Message < ActiveRecord::Base 
    attr_encrypted :name, key: ... 
    attr_encrypted :body, key: ... 
    ... 
end 
  1. Schreibtest/Einrichtung/messages.yml.noenc als folgt, die Klarnamen und den Text hat:
msg1: 
    name: Hello 
    body: Hello, I am here... 
msg2: 
    name: How are you 
    body: Good morning, ... 
  1. schreibe wie die folgende Rake-Aufgabe (z.B. lib/tasks/encrypt_fixture.rake) um messages.yml.noenc in Nachrichten zu konvertieren.yml:
require 'active_record/fixtures' 

src_yml = 'test/fixtures/messages.yml.noenc' 
dest_yml = 'test/fixtures/messages.yml' 

task 'test' => dest_yml 

namespace :[MY_APP] do 
    desc "generate encrypted fixture" 
    file dest_yml => src_yml do |t| 
    require Rails.root + 'config/environment' 

    encrypted_hash = {} 
    for k, v in YAML.load(ERB.new(File.read(Rails.root + src_yml)).result) do 
     msg = Message.new(v.merge([ANY ADDITIONAL ATTRS])) 
     encrypted_hash[k] = { 
     'encrypted_name' => msg.encrypted_name, 
     'encrypted_name_iv' => msg.encrypted_name_iv, 
     'encrypted_body' => msg.encrypted_body, 
     'encrypted_body_iv' => msg.encrypted_body_iv, 
     [ANY ADDITIONAL KEY_N_VALUE] 
     } 
    end 

    File.open(Rails.root + t.name, 'w') do |f| 
     f.write(<<EOH) 
    #---------------------------------------------------------------------- 
    # DO NOT MODIFY THIS FILE!! 
    # 
    # This file is generated from #{src_yml} by: 
    # 
    # (edit #{src_yml}) 
    # $ rake [MY_APP]:generate_fixture, or 
    # $ rake 
    #---------------------------------------------------------------------- 
EOH 
     f.write(encrypted_hash.to_yaml) 
    end 
    end 
end 

Bitte ersetzen Sie [MY_APP], [ALLE WEITEREN ATTRS] und [Jede zusätzliche KEY_N_VALUE] an die tatsächlichen Werte.

Dann überprüft "Rake" oder "Rake-Test" die Dateiabhängigkeit zwischen messages.yml.noenc und messages.yml und generiert messages.yml, wenn dies vor dem 'Rake-Test' erforderlich ist.

Verwandte Themen