3

我一直在看 attr_encrypted,但是它将密钥存储在代码中,这似乎并不那么安全。如果我的网络服务器遭到破坏,加密将无济于事。

如果我的网络服务器遭到破坏,有哪些选项可以保证数据的安全?

4

2 回答 2

2

密钥必须在内存中才能执行加密和解密。如果您的服务器遭到破坏,那么无论您如何存储密钥,您都会被淘汰;一旦攻击者可以访问您的本地计算机,所有赌注都将关闭。如果您的应用程序可以解密数据,他们也将能够解密,这取决于他们愿意花费多少精力来提取这些密钥。

attr_encrypted 将保护您免受 SQL 注入等导致敏感数据泄露的事情的影响,但是如果您的应用程序受到威胁,那么您的攻击者可以访问您的应用程序可以访问的任何内容。

但是,为了使其更难,您可以使用密码加密的密钥。您可以将加密的密钥存储在磁盘上,然后在部署应用程序(或以其他方式启动它)时,您将提供密码以将密钥解密到内存中,然后将密码丢弃。这仍然不能保护您免受有人在您的进程内存中搜索,这意味着每次您的应用程序需要启动时您都必须进行人工交互(这可能是自动监控的问题),但这会大大增加难度(但不阻止)从受感染的机器中提取加密密钥。

于 2014-06-19T08:03:31.590 回答
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文件存储密钥并使用工头检索环境变量。Heroku 提供了一种从仪表板设置环境变量的简单方法。

于 2015-10-19T18:11:36.760 回答