我刚刚发现了Stack Overflow,我只是在检查是否存在与项目中的一些朋友有约束的想法,尽管这更像是一个理论问题,我一直在试图在一段时间内找到答案。
我对密码学的了解不多,但如果我不够清楚,我会尝试编辑/评论以澄清任何问题。
试图简短,环境是这样的:
一种应用程序,其中前端作为加密/解密密钥和后端的访问权限仅用于存储和查询。
拥有一个您无法访问几个字段的数据库,例如,像往常一样说“text”,即text / varchar。
您无权访问用于解密信息的密钥,并且所有信息都已到达已加密的数据库。
主要的问题是这样的,如何在数据库上一致地进行查询,不可能做像“%F§YU/'〜#JKSks23%'这样的地址”。 (如果有人觉得这个答案可以自由拍摄)。
但where address='±!NNsj3~^º-:'
可以吗?或者它还会完全耗尽数据库?
可能适用的另一个限制是前端没有太多可用的处理能力,因此已经加密/解密信息开始将其推向极限。 (这样说是为了避免回复,例如“将表连接导出到前端并在那里查询”。)
有人能指点我继续思考吗?
非常感谢上午4点快速回复,第一次使用我真的对这个社区印象深刻。 (或者我可能只是针对不同的时区)
只是提供一些信息:
主要问题是部分匹配。作为大多数数据库的强制要求,允许部分匹配。主要约束实际上是不允许数据库所有者在数据库中查找信息。在过去的10分钟里,我想出了一个可能的解决方案,它再次扩展到可能的数据库问题,我将在这里添加:
允许半部分匹配的可能解决方案:
新问题:
Post Scriptum:我没有接受Cade Roux的回答,只是为了进一步讨论,特别是对新问题的回答。
答案 0 :(得分:4)
你可以按照你描述的方式进行 - 比如有效地查询哈希,但是没有很多系统具有这种要求,因为在那时安全要求正在干扰系统可用的其他要求 - 即没有部分匹配,因为加密规则出来了。压缩也是同样的问题。几年前,在非常小的环境中,我必须在将数据放入数据格式之前对其进行压缩。当然,这些领域不容易被搜索。
在一个更典型的应用程序中,最终,链中的某些人可以使用密钥 - 可能是Web服务器。
对于最终用户流量,SSL会保护该管道。一些网络交换机可以在Web服务器和数据库之间保护它,并且将加密数据存储在数据库中很好,但是您不会查询这样的加密数据。
一旦显示数据,它就会出现在机器上,因此任何通用计算设备都可以在那时被规避,并且你的应用程序之外的外围防御系统真正发挥作用。
答案 1 :(得分:2)
为什么不加密持有数据库表的磁盘,加密数据库连接,让数据库正常运行?
[我真的不明白需要这种偏执程度的背景/约束]
编辑:“法律约束”呃?我希望你没有涉及任何非法的事情,我不想成为一个无意的配件......; - )如果 - ahem - 法律约束 - 强制使用这个解决方案,那就完成所有工作 - 没有LIKE匹配,如果客户端机器无法处理它,则响应速度慢。
答案 2 :(得分:1)
几个月前,我遇到了同样的问题:整个数据库(索引除外)都已加密,部分匹配问题也出现了。
我搜索互联网寻找解决方案,但似乎没有太多事情要做,只是一个“解决方法”。
我最终采用的解决方案是:
创建一个临时表,其中包含正在执行查询的字段数据,已解密以及另一个作为表主键的字段(显然,此字段不必按原样解密)纯文本)。
再次执行临时表的部分匹配并检索标识符。
在实际表中查询这些标识符并返回结果。
删除临时表。
我知道这会产生一个非常重要的开销,但是当强制要求数据库完全加密时,我还没有找到另一种方法来执行此任务。
根据每种特定情况,您可以过滤插入临时表的行数而不会丢失结果数据(仅考虑属于执行查询的用户的行等)。 ..)。
答案 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
现在它在数据库端加密,所以没有人能找到它 - 即使他们查看了你的源代码。但是,找到盐会帮助他们解密它。
答案 4 :(得分:0)
如果您需要存储以后要查询的敏感数据,我建议将其存储为纯文本,尽可能限制对该表的访问。
如果您不能这样做,并且您不希望前端有开销,则可以在服务器中运行的后端组成一个处理加密数据的组件。
查询加密数据?如果您使用的是良好的加密算法,我无法想象如何做到这一点。