我一直在关注attr_encrypted,但它会将密钥存储在代码中,而这似乎并不那么安全。如果我的网络服务器遭到破坏,加密将无济于事。
如果我的网络服务器遭到破坏,有哪些选项可以保证数据安全?
答案 0 :(得分:2)
密钥必须在内存中才能执行加密和解密。如果您的服务器遭到破坏,无论您如何存放密钥,您都会受到打击;一旦攻击者可以访问您的本地计算机,所有投注都将被取消。如果您的应用可以解密数据,那么他们也可以根据他们愿意花费多少精力来提取这些密钥。
attr_encrypted将保护您免受SQL注入等导致敏感数据泄露的问题,但如果您的应用受到攻击,则攻击者可以获取您的应用可以访问的任何内容。
但是,为了使其更难,您可以使用密码加密的密钥。您可以将加密密钥存储在磁盘上,然后在部署应用程序时(或以其他方式启动它),您将提供密码以将密钥解密到内存中,然后将密码丢弃。这仍然无法保护您免受某人贪图通过您的进程内存的影响,这意味着您每次应用程序需要启动时都必须进行人工交互(这可能是自动监控的问题),但这会大大增加难度(但不是阻止)从受感染的机器中提取加密密钥。
答案 1 :(得分:0)
我使用环境变量来设置键。开发或生产有不同的方法很容易。
加密问题:
# app/models/concerns/encryption.rb
module Encryption
extend ActiveSupport::Concern
module ClassMethods
def encryption_key
ENV['ENCRYPT_KEY']
end
end
end
在模型中,使用关注的方法。
class User < ActiveRecord::Base
include Encryption
attr_encrypted :name, :key => encryption_key
end
在开发中,使用.env
文件存储密钥并使用foreman检索环境变量。 Heroku提供了一种从仪表板设置环境变量的简便方法。