Я пытаюсь зашифровать и дешифровать хэш в 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'
Однако, иногда это работает. Как я могу это исправить?
Ваше понимание ** хэш ** отличается от моего понимания ** хэш **. Это рубиновая вещь? Мышь над тегом * hash *, чтобы увидеть мое понимание. –
@ArtjomB. Я думаю, что Ruby называет их hashmap/dict data type ["hash"] (https://en.wikibooks.org/wiki/Ruby_Programming/Data_types#Hashes). – Paul