我刚才看到有可能在rails中解密和加密字符串而不包含任何库,但我找不到博客文章。
我希望能够加密和解密字符串而不包含任何内容。 使用相同的密钥可以用于rails中的所有其他内容,例如签名的cookie。
有什么想法吗?
答案 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
中所述答案 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