是否有任何方法可以在SQL Azure中的加密列中进行搜索

本文关键字:加密 搜索 Azure SQL 任何 方法 是否 | 更新日期: 2023-09-27 18:26:44

假设我想在"表上有一本书"这句话中搜索单词"book",我需要以加密的形式存储这句话。在独立的SQL Server上,你可以使用对称密钥加密,SQL Server持有密钥,它可以在加密的列中搜索短语匹配,只返回匹配的行。但我想使用SQL Azure,它不支持对称密钥。我该怎么做?我可以使用哪些变通方法在较长的加密varchar字符串中查找短语?

如果我想搜索整个句子,而不是一个单词,我可以很容易地在C#中的应用程序级别进行加密/解密。我可以用C#加密整句话,它可能会返回"1234567890",并要求SQL Server找到加密字符串的完美匹配。这适用于在列中查找整个值。对我来说,问题是我只需要搜索整个字符串(单词"book")的一部分。如果我在C#中加密"book",假设加密算法返回"asdf"。如果我加密整个句子,并且算法返回"1234567890",那么我的子字符串"asdf"将找不到。如果我让SQL查找像"asdf"这样的字符串,它不会在完整的句子加密字符串中找到,除非我能找到一种算法,其中子字符串总是在较大的加密句子中找到(其中加密的"book"在整个句子中变为"3456",变为"1234567890")。

我真的很想使用SQLAzure,但我需要一种在加密的较大字符串中搜索字符串LIKE匹配的方法。如果有帮助的话,我甚至对使用CLR存储过程持开放态度,但我不确定它是否会。有什么建议吗?

是否有任何方法可以在SQL Azure中的加密列中进行搜索

唯一能做到这一点的方法是解密句子,然后在解密的句子中搜索单词。

如果你试图避免解密句子,另一种选择是创建一个"索引"表,在原始句子加密时,扫描可索引的单词,并将这些单词添加到索引表中,同时将一些外键添加到保存句子的表中。然后,当你需要搜索一个单词时,只需将该单词与你的索引表匹配即可。

与icemanmind的想法略有不同:

您可以使用像Lucene这样的索引模式,并根据需要首先解密的表记录在内存中构建索引:https://code.msdn.microsoft.com/windowsazure/Azure-Library-for-83562538

另一种方法,因为它与在单独的表中进行索引有关,是对句子中单个单词的哈希值进行索引,并使用哈希作为索引。如果这很重要的话,这样做的好处是保证你的话的安全。