使用Rails加密,解密

时间:2011-03-30 21:04:43

标签: ruby-on-rails encryption

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

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

有什么想法吗?

4 个答案:

答案 0 :(得分:119)

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

crypt = ActiveSupport::MessageEncryptor.new(Rails.application.secrets.secret_key_base)
encrypted_data = crypt.encrypt_and_sign('my confidental data')

加密数据可以通过以下方式解密:

decrypted_back = crypt.decrypt_and_verify(encrypted_data)

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

答案 1 :(得分:7)

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')

解密:

 decrypted_back = crypt.decrypt_and_verify(encrypted_data)

答案 2 :(得分:1)

Rails 5更新:

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

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')

docu

中所述

discussion on this change

答案 3 :(得分:-8)

如果您要使用可以持久保存任何请求/响应的相同密钥,则可以使用以下自定义方法。

// data,要加密并标记为true(表示加密)和false(代表解密)

def data_encryption(data, flag)  
    data = data.to_s
    key = "any string" (32 alphanumeric string length is preferred)
    if flag
     return Base64.encode64(data) + key
    else
      data = data.sub(key, '')
     return Base64.decode64(data)  
    end
end