加密的数据库查询

时间:2008-10-08 02:17:35

标签: sql database encryption theory

我刚刚发现了Stack Overflow,我只是在检查是否存在与项目中的一些朋友有约束的想法,尽管这更像是一个理论问题,我一直在试图在一段时间内找到答案。

我对密码学的了解不多,但如果我不够清楚,我会尝试编辑/评论以澄清任何问题。

试图简短,环境是这样的:

  • 一种应用程序,其中前端作为加密/解密密钥和后端的访问权限仅用于存储和查询。

  • 拥有一个您无法访问几个字段的数据库,例如,像往常一样说“text”,即text / varchar。

  • 您无权访问用于解密信息的密钥,并且所有信息都已到达已加密的数据库。

主要的问题是这样的,如何在数据库上一致地进行查询,不可能做像“%F§YU/'〜#JKSks23%'这样的地址”。 (如果有人觉得这个答案可以自由拍摄)。

where address='±!NNsj3~^º-:'可以吗?或者它还会完全耗尽数据库?

可能适用的另一个限制是前端没有太多可用的处理能力,因此已经加密/解密信息开始将其推向极限。 (这样说是为了避免回复,例如“将表连接导出到前端并在那里查询”。)

有人能指点我继续思考吗?


非常感谢上午4点快速回复,第一次使用我真的对这个社区印象深刻。 (或者我可能只是针对不同的时区)

只是提供一些信息:

主要问题是部分匹配。作为大多数数据库的强制要求,允许部分匹配。主要约束实际上是不允许数据库所有者在数据库中查找信息。在过去的10分钟里,我想出了一个可能的解决方案,它再次扩展到可能的数据库问题,我将在这里添加:

允许半部分匹配的可能解决方案:

  • 密码+用户的几个公共字段实际上是加密的关键。对于身份验证,我们的想法是加密静态值并在数据库中对其进行比较。
  • 创建一组新的表,其中信息以解析的方式存储,意思是:“4th Street”将成为2个加密行(一个用于'4th',另一个用于'Street')。这已经允许半部分匹配,因为搜索已经可以在单独的表上执行。

新问题:

  • 这可能会再次耗尽数据库服务器,还是有人认为它是部分匹配问题的可行解决方案?

Post Scriptum:我没有接受Cade Roux的回答,只是为了进一步讨论,特别是对新问题的回答。

5 个答案:

答案 0 :(得分:4)

你可以按照你描述的方式进行 - 比如有效地查询哈希,但是没有很多系统具有这种要求,因为在那时安全要求正在干扰系统可用的其他要求 - 即没有部分匹配,因为加密规则出来了。压缩也是同样的问题。几年前,在非常小的环境中,我必须在将数据放入数据格式之前对其进行压缩。当然,这些领域不容易被搜索。

在一个更典型的应用程序中,最终,链中的某些人可以使用密钥 - 可能是Web服务器。

对于最终用户流量,SSL会保护该管道。一些网络交换机可以在Web服务器和数据库之间保护它,并且将加密数据存储在数据库中很好,但是您不会查询这样的加密数据。

一旦显示数据,它就会出现在机器上,因此任何通用计算设备都可以在那时被规避,并且你的应用程序之外的外围防御系统真正发挥作用。

答案 1 :(得分:2)

为什么不加密持有数据库表的磁盘,加密数据库连接,让数据库正常运行?

[我真的不明白需要这种偏执程度的背景/约束]

编辑:“法律约束”呃?我希望你没有涉及任何非法的事情,我不想成为一个无意的配件......; - )

如果 - ahem - 法律约束 - 强制使用这个解决方案,那就完成所有工作 - 没有LIKE匹配,如果客户端机器无法处理它,则响应速度慢。

答案 2 :(得分:1)

几个月前,我遇到了同样的问题:整个数据库(索引除外)都已加密,部分匹配问题也出现了。

我搜索互联网寻找解决方案,但似乎没有太多事情要做,只是一个“解决方法”。

我最终采用的解决方案是:

  1. 创建一个临时表,其中包含正在执行查询的字段数据,已解密以及另一个作为表主键的字段(显然,此字段不必按原样解密)纯文本)。

  2. 再次执行临时表的部分匹配并检索标识符。

  3. 在实际表中查询这些标识符并返回结果。

  4. 删除临时表。

  5. 我知道这会产生一个非常重要的开销,但是当强制要求数据库完全加密时,我还没有找到另一种方法来执行此任务。

    根据每种特定情况,您可以过滤插入临时表的行数而不会丢失结果数据(仅考虑属于执行查询的用户的行等)。 ..)。

答案 3 :(得分:0)

您想要使用md5哈希。基本上,它会将您的字符串转换为无法再现的哈希值。然后,您可以使用它来验证以后的事情。例如:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "INSERT INTO addresses (address) VALUES ('" . md5($salt . $address) . "')";
mysql_query($sql);

然后,要在将来验证地址:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "SELECT address FROM addresses WHERE address = '" . md5($salt . $address) . "'";
$res = mysql_query($sql);
if (mysql_fetch_row($res))
    // exists
else
    // does not

现在它在数据库端加密,所以没有人能找到它 - 即使他们查看了你的源代码。但是,找到盐会帮助他们解密它。

http://en.wikipedia.org/wiki/MD5

答案 4 :(得分:0)

如果您需要存储以后要查询的敏感数据,我建议将其存储为纯文本,尽可能限制对该表的访问。

如果您不能这样做,并且您不希望前端有开销,则可以在服务器中运行的后端组成一个处理加密数据的组件。

查询加密数据?如果您使用的是良好的加密算法,我无法想象如何做到这一点。