【问题标题】:Database encryption in RailsRails 中的数据库加密
【发布时间】:2012-05-15 08:23:36
【问题描述】:

我正在使用 ActiveRecord serialize 方法和我自己的一个类 AESCoder。这将每次使用带有随机初始化向量的 aes-256-cbc。当我将它存储在数据库中时,这个初始化向量是预先添加到字段中的,当然是在反序列化之前提取的。

现在,这个方案阻止我对这些属性使用任何查找器。我必须选择我需要的所有行,这些行将被自动解密,并在项目列表上执行 ruby​​ select。当然,这是一个巨大的性能瓶颈,我无法承受这个应用程序。

一种解决方案是不使用随机 IV,但 aes-256-cbc 将不再安全。

我在这里忽略了什么吗?

【问题讨论】:

  • 您是否有充分的理由要加密数据库中的单个实体?例如,为什么不将数据库放在加密文件系统上?
  • 我的应用在 Heroku 上。我无法控制文件系统。
  • 我不知道 Heroku,但是以稍微不同的方式问我的问题:您试图通过加密数据来防范的攻击场景是什么?您是否担心其他人可能会在您的应用程序运行的系统上获得 root 权限?让外部用户访问您的数据库记录的 SQL 注入错误?还有什么?您的解决方案应根据威胁的性质量身定制。
  • 坦率地说,我在这里只是面临合同义务。我知道不同的攻击媒介,并且我知道如果有人控制了应用程序服务器,那么关键就在眼前。我正在尝试减轻每个查询现在面临的大量开销,仅此而已。

标签: ruby-on-rails-3 security encryption aes


【解决方案1】:

正如其他人所指出的,将无法绕过解密要搜索的行的需要。您仍然可以通过让 Postgres 在其 pgcrypto extension 的帮助下完成繁重的工作来提高性能,而不是选择所有内容并在应用程序层对其进行整理。

Heroku recently started offering Postgres 9.1 似乎支持 pgcrypto。根据博客文章,您可能必须迁移数据库才能切换到 Postgres 9.1。

请注意,Herokus 付费的“共享数据库”计划似乎仍然是 run on Postgres 8 并且还不支持 pgcrypto,但应该很快就会升级。 Postgres 9 引入了一种启用和使用扩展的新方法,可以更轻松地在共享托管环境中提供它们。

【讨论】:

  • 在数据库服务器上进行加密和解密不会解决大部分性能问题,并且会使系统不安全。如果数据库服务器被入侵,那么攻击者就拥有了密钥。无论如何,数据库服务器妥协确实是加密所防御的唯一东西,所以在那一点上为什么还要麻烦呢?在这种情况下,您仍然需要支付大部分性能成本:解密数据。您所做的只是节省了跨网络传输的成本
  • @imichaelmiers 正如你之前写的,"[..] 我的理解是,如果你的数据库服务器是 root 的,那么你的应用程序很可能也是如此。"。我同意你的看法。在某些时候,您的密钥和数据将以可读的、未加密的形式存在 - 无论是在应用服务器中,还是在数据库服务器中。虽然使用 Postgres 来处理加密肯定不是万能的,但它仍然可以提供相当大的性能优势:降低网络流量的速度、降低 Ruby 对象实例化的速度以及降低 Ruby 操作的速度。性能提升取决于选择的行数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2023-04-08
  • 2013-11-19
  • 2011-04-26
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多