在我的数据库中,我以加密形式存储学生信息。
现在我想执行搜索以列出所有名称以“某物”开头或包含“某物”的学生
任何人都知道如何执行此类查询? 请建议
答案 0 :(得分:1)
任何体面的加密算法都有其核心功能之一,即仅通过查看加密文本就无法推断出有关明文的任何内容。如果您能够通过查看加密文本来判断明文是否包含字符串william
,那么任何攻击者都可以轻松获取该信息,您也可以根本不加密
对数据执行此类操作的唯一方法是访问解密数据。使用您所描述的模型 - 数据库只能看到加密数据 - 数据库无法完成这项工作,因为数据库无法访问所需的数据。
您需要拥有要解密的数据。唯一完成此操作的方法是让应用程序将所有数据从数据库中拉出来,解密,然后在应用程序中进行过滤/排序/任何操作。显然这不会很好地扩展 - 但是当你决定在将数据放入数据库之前加密数据时,你肯定会考虑到这一点。
另一种选择是存储未加密数据的片段。例如,如果您有first_name
字段,并且希望能够检索first_name
以a
开头的所有记录,请设置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”。
但是,我很好奇你正试图通过这种加密来达到什么样的安全目标。如果你更多地描述模型,你可能会得到更好的答案。