在Rails中的数据库加密

3
我正在使用ActiveRecord的serialize方法,并使用我自己的类AESCoder。这将每次使用带有随机初始化向量的aes-256-cbc。当我将其存储在数据库中时,此初始化向量会被放置在字段之前,并且在反序列化之前当然会被提取。
现在,这种方案阻止我在这些属性上使用任何查找器。我必须选择所有需要的行,这将自动解密,并在项列表上执行ruby select。这当然是一个巨大的性能瓶颈,我无法承受这个应用程序。
一种解决方案是不使用随机 IV,但是这样 aes-256-cbc 将不再那么安全。
我是否忽略了什么?

你想在数据库中加密个别条目,有什么充分的理由吗?例如,为什么不将数据库放置在加密文件系统上呢? - Enno
我的应用程序在Heroku上。我无法控制文件系统。 - Julio Santos
我不了解Heroku,但稍微换个问法:你试图通过加密数据来防范什么攻击场景?你是否担心其他人可能会在运行你的应用程序的系统上获得root权限?SQL注入错误导致外部用户访问你的数据库记录?还是其他什么?你的解决方案应该根据威胁的性质进行定制。 - Enno
坦白地说,我只是面临合同义务。我知道不同的攻击向量,也知道如果有人控制了应用服务器,密钥就会呈现在明面上。我只是试图减少当前每个查询所面临的巨大开销而已。 - Julio Santos
1个回答

2
正如其他人所指出的,如果要搜索需要解密行,那么没有绕过这个需求的方法。但是您可以通过使用Postgres的pgcrypto扩展来提高性能,而不是在应用程序层选择所有内容并进行筛选。
Heroku 最近开始提供Postgres 9.1,似乎支持pgcrypto。根据博客文章,您可能需要迁移数据库才能切换到Postgres 9.1。
请注意,Heroku的付费“共享数据库”计划仍然似乎运行在Postgres 8上,还不支持pgcrypto,但预计很快就会升级。Postgres 9引入了一种新的启用和使用扩展的方式,使得在共享托管环境中更容易提供它们。

在数据库服务器上进行加密和解密不会解决大部分性能问题,反而会使系统不安全。如果数据库服务器被攻击者入侵,那么攻击者就拥有了密钥。无论如何,数据库服务器的妥协才是加密所能防御的唯一事情,因此为什么还要费心呢?在这种情况下,您仍然需要支付大部分性能成本:解密数据。你所做的只是节省了通过网络传输数据的成本。 - imichaelmiers
@imichaelmiers 正如你之前所写的那样,"我的理解是,如果你的数据库服务器被入侵,你的应用程序可能也会受到影响。" 我同意你的观点。在某些情况下,你的密钥和数据将以可读、未加密的形式存在 - 无论是在应用服务器还是在数据库服务器上。使用Postgres处理加密虽然不是万能药,但仍可能提供相当大的性能优势:减少缓慢的网络流量、减少缓慢的Ruby对象实例化和减少缓慢的Ruby操作。性能增益取决于选择的行数。 - janfoeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接