2016-04-04 5 views
2

Я пытаюсь зашифровать и дешифровать хэш в Ruby с помощью ActiveSupport::MessageEncryptor. Во-первых, создать и сериализовать хэш:Ruby hash encrypting

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

Тогда я склеп сериализованную хэш:

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" 

Проблема заключается в том, что я не могу его расшифровать:

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' 

Однако, иногда это работает. Как я могу это исправить?

+1

Ваше понимание ** хэш ** отличается от моего понимания ** хэш **. Это рубиновая вещь? Мышь над тегом * hash *, чтобы увидеть мое понимание. –

+1

@ArtjomB. Я думаю, что Ruby называет их hashmap/dict data type ["hash"] (https://en.wikibooks.org/wiki/Ruby_Programming/Data_types#Hashes). – Paul

ответ

0

Вы использовали другое имя переменной по сравнению с именем, которое вы использовали в качестве аргумента в последней команде. Для меня работает следующая команда:

crypt.decrypt_and_verify(crypted_string) 
0

Обязательно используйте тот же ключ/соль. Если вы пытаетесь, что в консоли, проблема, скорее всего, в имени переменной encrypted_string против crypted_string = ...

1

отлично работает для меня, добавив, этот последний шаг дает мне оригинальный хэш

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