假设我想在“桌子上有一本书”的句子中搜索“book”这个词。我需要以加密形式存储句子。在独立的SQL Server上,您可以使用对称密钥加密,其中SQL Server保存密钥,它可以在加密列中搜索词组匹配,并仅返回匹配的行。但我想使用SQL Azure,它不支持对称密钥。我怎样才能做到这一点?我可以使用哪些变通方法在较长的加密varchar字符串中查找短语?
如果我想搜索整个句子而不是单词,我可以轻松地在C#中的应用程序级别进行加密/解密。我可以加密C#中的整个句子,它可能返回“1234567890”并要求SQL Server找到加密字符串的完美匹配。这适用于在列中查找整个值。对我来说问题是我需要搜索整个字符串的一部分(“book”一词)。如果我在C#中加密“book”,假设加密算法返回“asdf”。如果我加密整个句子,并且算法返回“1234567890”,那么将找不到我的子串“asdf”。如果我要求SQL查找字符串LIKE“asdf”,它将不会在全句加密字符串中找到它,除非我能找到一个算法,其中子串总是在较大的加密句子中找到(其中“book”加密变为“3456” “在整个句子中变成”1234567890“)。
我真的想使用SQL Azure,但我需要一种在加密的更大字符串中搜索字符串LIKE匹配的方法。我甚至愿意使用CLR存储过程,如果这有帮助,但我不确定它会。有什么建议吗?
答案 0 :(得分:0)
您能够做到这一点的唯一方法是解密句子,然后在解密的句子中搜索单词。
如果您试图避免解密该句子,另一种选择是创建一个“索引”表,并在原始句子加密时,扫描可索引的单词并将这些单词添加到您的索引表中,同时包含句子的表的一些外键。然后,当您需要搜索单词时,只需将该单词与您的索引表匹配即可。
答案 1 :(得分:0)
icemanmind的想法略有不同:
您可以使用像Lucene这样的索引模式,并根据表格的记录在内存中构建索引,这些记录需要先解密:https://code.msdn.microsoft.com/windowsazure/Azure-Library-for-83562538
另一个,因为它与单独表中的索引相关,将索引句子中单个单词的哈希值,并使用哈希作为索引。如果这很重要,这有利于保持您的文字安全。