使用Rails加密,解密

Lin*_*der 43 encryption ruby-on-rails

我刚才看到有可能在rails中解密和加密字符串而不包括任何库,但我找不到博客文章.

我希望能够加密和解密字符串而不包含任何内容.使用相同的密钥可以用于rails中的所有其他内容,例如签名的cookie.

有任何想法吗?

ger*_*tas 125

你的意思是这个?:ActiveSupport :: MessageEncryptor.以下是重用Rails 4应用程序秘密的方法:

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base)
encrypted_data = crypt.encrypt_and_sign('my confidental data')
Run Code Online (Sandbox Code Playgroud)

加密数据可以解密:

decrypted_back = crypt.decrypt_and_verify(encrypted_data)
Run Code Online (Sandbox Code Playgroud)

以前Rails 3使用secret_token配置选项和加密方法encrypt decrypt.

  • 要获取secret_key_base,请使用`Rails.application.secrets.secret_key_base` (21认同)
  • 那非常皮条客. (7认同)
  • 这是我正在寻找的一个很好的解决方案,谢谢!简单来说,自Rails 4.0以来,ActiveSupport :: MessageEncryptor接口已经发生了变化,示例已经过时.您应该调用encrypt_and_sign而不是encrypt和decrypt_and_verify而不是解密. (4认同)
  • 如 /sf/ask/384466421/#comment93082974_49560436 中所述,只有当 Secret_key_base 长度至少为 32 字节时,这才适用于 Rails 5。 (2认同)

est*_*ani 9

Rails 5 更新:

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31])
encrypted_data = crypt.encrypt_and_sign('my confidental data')
Run Code Online (Sandbox Code Playgroud)

Rails 5.x 需要一个正好为 32 字节的键。

要使用更长的密钥验证先前签名的消息:

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base[0..31], Rails.application.secrets.secret_key_base)
encrypted_data = crypt.encrypt_and_sign('my confidental data')
Run Code Online (Sandbox Code Playgroud)

文档中所述

以及关于这个变化讨论


gue*_*o64 8

Rails 5要求密钥为32字节.

编辑到Rails 4回答适用于Rails 5:

 key = SecureRandom.random_bytes(32)
 crypt = ActiveSupport::MessageEncryptor.new(key) 
 encrypted_data = crypt.encrypt_and_sign('my confidental data')
Run Code Online (Sandbox Code Playgroud)

解密:

 decrypted_back = crypt.decrypt_and_verify(encrypted_data)
Run Code Online (Sandbox Code Playgroud)

  • 密钥是否保留在任何地方?或者这只是一次针对一个请求(或保留在内存中的某些内容)?我认为使用 Rails 密钥库的想法是它可以在请求之间重用。 (2认同)