如何在将值存储为加密时搜索值

时间:2010-01-06 10:59:10

标签: iphone database encryption

在我的数据库中,我以加密形式存储学生信息。

现在我想执行搜索以列出所有名称以“某物”开头或包含“某物”的学生

任何人都知道如何执行此类查询? 请建议

3 个答案:

答案 0 :(得分:1)

任何体面的加密算法都有其核心功能之一,即仅通过查看加密文本就无法推断出有关明文的任何内容。如果您能够通过查看加密文本来判断明文是否包含字符串william,那么任何攻击者都可以轻松获取该信息,您也可以根本不加密

对数据执行此类操作的唯一方法是访问解密数据。使用您所描述的模型 - 数据库只能看到加密数据 - 数据库无法完成这项工作,因为数据库无法访问所需的数据。

您需要拥有要解密的数据。唯一完成此操作的方法是让应用程序将所有数据从数据库中拉出来,解密,然后在应用程序中进行过滤/排序/任何操作。显然这不会很好地扩展 - 但是当你决定在将数据放入数据库之前加密数据时,你肯定会考虑到这一点。

另一种选择是存储未加密数据的片段。例如,如果您有first_name字段,并且希望能够检索first_namea开头的所有记录,请设置first_name_first_letter字段。显然,这也不能很好地扩展 - 如果你想搜索first_name包含ill的所有记录,你将不得不存储未加密的完整first_name。< / p>

此解决方案存在更严重的问题:通过存储未加密的数据,您将泄露有关加密数据的信息。您存储的未加密数据越多,泄漏的越多。泄漏的越多,攻击者就会越多地提供破坏加密的线索 - 此外,如果你存储了他们对未加密感兴趣的位,他们已经赢了。

答案 1 :(得分:1)

Another question指向SQLCipher - 这是sqlite的一个实现,它在数据库中进行加密。它似乎是针对您的用例 - 它甚至已经在几个iPhone应用程序上使用。

但是,它有数据库进行加密,而不是应用程序。这使得数据库也可以处理解密,因此数据库可以检查字段的内容并进行您正在寻找的搜索。

如果你仍坚持不在数据库中进行加密,这对你不起作用。

答案 2 :(得分:0)

如果你想要的只是“starts with”和“contains”,你可以用位字段和按位逻辑运算符做一些事情。

不确定您使用的语法,确切地说(我在SQL上有点生疏),但想法是为每个记录创建一个附加字段,为名称中出现的每个字母设置一个位,然后做类似的事情:

SELECT * from someTable where(searchValue&amp; bitField)&gt; 0

然后,您需要迭代这些记录,解密它们,并确定它们实际是否符合您真正想要搜索的条件(因为您将从中获取所需记录的超集)搜索)。

你显然会通过这样做泄漏一些关于字段内容的信息,但你也可以通过加密位域来减少这一点,或者通过在每个位域中打开一些额外的位来减少这一点,这样你就可以'例如,告诉“bob”来自“bobby”。

但是,我很好奇你正试图通过这种加密来达到什么样的安全目标。如果你更多地描述模型,你可能会得到更好的答案。