2016-04-04 12 views
2

Ich versuche, Hash in Ruby zu verschlüsseln und zu entschlüsseln, indem Sie ActiveSupport::MessageEncryptor verwenden. Erstens ich Hash erstellen und serialisiert werden:Ruby-Hash-Verschlüsselung

hash = { a: 1, b: 2 } 
serialized_hash = Marshal.dump(hash) #=> "\x04\b{\a:\x06ai\x06:\x06bi\a" 

Dann Krypta ich serialisiert hash:

salt = SecureRandom.random_bytes(64) 
key = ActiveSupport::KeyGenerator.new('password').generate_key(salt) # => "\x89\xE0\x156\xAC..." 
crypt = ActiveSupport::MessageEncryptor.new(key) 
crypted_string = crypt.encrypt_and_sign(serialized_hash) 
#=> "NHhLdDMwQS9MMkwwK1RFZjMyOFJNRXRkZ2VJY1o3aGtwaC9Wb0wvSnhmVT0tLW1nWTNqUElPWEdhMCsrMHI5R2FST2c9PQ==--01150a6eae1691887ace4164019fea2bd353f092" 

Problem ist, dass ich es nicht entschlüsseln kann:

crypt.decrypt_and_verify(crypted_string) 
ActiveSupport::MessageVerifier::InvalidSignature: ActiveSupport::MessageVerifier::InvalidSignature 
from /home/user/.rvm/rubies/ruby-2.2.3/lib/ruby/gems/2.2.0/gems/activesupport-4.2.6/lib/active_support/message_verifier.rb:49:in `verify' 

Aber manchmal funktioniert es. Wie kann ich es reparieren?

+1

Ihr Verständnis von a ** Hash ** unterscheidet sich von meinem Verständnis von ** Hash **. Ist das eine Rubin Sache? Bewegen Sie die Maus über das * hash * -Tag, um mein Verständnis zu sehen. –

+1

@ArtjomB. Ich denke Ruby nennt ihren hashmap/dict Datentyp ["hash"] (https://en.wikibooks.org/wiki/Ruby_Programming/Data_types#Hashes). – Paul

Antwort

0

Sie haben einen anderen Variablennamen verwendet als den Namen, den Sie als Argument im letzten Befehl verwendet haben. Der folgende Befehl funktioniert für mich:

crypt.decrypt_and_verify(crypted_string) 
0

Stellen Sie sicher, den gleichen Schlüssel/Salz zu verwenden. Wenn Sie, dass in der Konsole sind versucht, das Problem ist höchstwahrscheinlich in Variablennamen encrypted_string vs crypted_string = ...

1

Arbeiten gut für mich und fügte hinzu, diesen letzten Schritt gibt mir den ursprünglichen Hash

result = crypt.decrypt_and_verify(crypted_string) 
Marshal.load(result)