我正在寻找使用对称密钥应用SQL列级加密。创建数据库主密钥,证书和对称密钥所需的初始步骤似乎很简单,我已经成功使用对称密钥测试了加密/解密数据。WHERE子句中的SQL加密列
但是,一旦数据被加密,我不知道如何最好地查询它。例如。
SELECT PlainTextA, PlainTextB, PlainTextC
WHERE CONVERT(varchar, DECRYPTBYKEY(EncyptedColumn)) = @SearchTerm
肯定会导致全表扫描?
我认为可能工作的另一个选择是首先加密搜索条件,例如,
SELECT PlainTextA, PlainTextB, PlainTextC
WHERE EncyptedColumn = ENCRYPTBYKEY(KEY_GUID('KeyName'), @SearchTerm)
但是这不起作用,因为生成的加密值总是不同的。
任何建议将不胜感激。
顺便说一句,你绝对不会**做的一件事就是用行特定值(PK)对散列进行赋值:你会完全回到方形1,不知道要寻找什么。对于这种情况,你*可以*用哈希值和*站点全局*值。这足以防止彩虹表攻击,但可以保持数据的可搜索性。请注意,虽然具有相同内容的两个不同行会*具有相同的散列,因此您正在公开某些信息,但是这是具有可搜索数据的定义。 – 2010-08-24 21:17:01
“请注意,虽然具有相同内容的两个不同的行将具有相同的散列” - 这是我使用散列的主要关注点,因为它降低了安全级别,但是我正在使用的表将具有4到5个加密列,如果我只为其中一个添加相应的哈希列,然后它可以被接受。 – 2010-08-24 21:36:39
请注意,表中的散列冲突会受到生日攻击(中间相遇)的影响,因此明显高于直觉。仍然SHA1有20个字节的相当大的地址空间。 – 2010-08-24 23:52:02