【发布时间】:2016-04-04 17:33:42
【问题描述】:
我尝试使用 ActiveSupport::MessageEncryptor 在 Ruby 中加密和解密哈希。首先我创建并序列化哈希:
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 的理解与我对 hash 的理解不同。这是红宝石吗?将鼠标悬停在 hash 标记上以查看我的理解。
-
@ArtjomB。我认为 Ruby 称他们的 hashmap / dict 数据类型为"hash"。
-
需要 json 库,然后调用 { foo: :bar }.to_json。简化加密,并且很容易在解密时解析回哈希。
标签: ruby-on-rails ruby encryption activesupport