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:搜索加密数据.