WHERE子句中的SQL加密列

Mat*_*t F 12 sql-server aes encryption-symmetric sql-server-2008

我希望使用对称密钥应用SQL列级加密.创建数据库主密钥,证书和对称密钥所需的初始步骤似乎很简单,我已成功使用对称密钥测试加密/解密数据.

但是,一旦数据被加密,我不知道如何最好地查询它.例如

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE CONVERT(varchar, DECRYPTBYKEY(EncyptedColumn)) = @SearchTerm
Run Code Online (Sandbox Code Playgroud)

肯定会导致全表扫描?

我认为可能有用的另一种选择是首先加密搜索条件,例如

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE EncyptedColumn = ENCRYPTBYKEY(KEY_GUID('KeyName'), @SearchTerm)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为生成的加密值总是不同的.

任何建议将不胜感激.

Rem*_*anu 14

典型的方法是存储加密值值的单向散列.当您寻找特定值时,您将寻求哈希值.通过这种方式,您可以高效查询,无需解密每一行,以便找到您感兴趣的值:

create table Table (
EncryptedColumn varbinary(max),
HashValue binary(20),
PlainA int,
PlainB varchar(256),
PlainC Datetime);

create index ndxTableHash on Table(HashValue);

select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm);
Run Code Online (Sandbox Code Playgroud)

从理论上讲,你可以在一个蓝色的月亮中发生一次哈希冲突,在偏心安全的情况下你可以在解密的列上添加一个双重检查:

select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;
Run Code Online (Sandbox Code Playgroud)

另请参阅索引加密数据SQL Server 2005:搜索加密数据.

  • 顺便说一下,你绝对不要做的一件事就是用行特定值(PK)来填充哈希:你将完全回到1号方,不知道要寻找什么.对于这种情况,您可以*使用*site global*值来哈希哈希.这足以防止彩虹表攻击,但保持数据可搜索.请注意,具有相同内容*的两个不同的行将具有相同的哈希,因此您将公开某些信息,但这是使数据可搜索的定义. (2认同)