Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-verschlüsselte Spalten in der WHERE-Klausel

Der typische Weg besteht darin, sowohl den verschlüsselten Wert als auch zu speichern ein Einweg-Hash des Werts. Wenn Sie nach einem bestimmten Wert suchen, suchen Sie nach dem Hash. Auf diese Weise können Sie effizient abfragen, ohne alle entschlüsseln zu müssen Zeile, um den gewünschten Wert zu finden:

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);

Theoretisch kann es alle paar Jahre zu einem Hash-Konflikt kommen. Um paranoidsicher zu sein, fügen Sie der entschlüsselten Spalte eine doppelte Überprüfung hinzu:

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

Siehe auch Verschlüsselte Daten indizieren und SQL Server 2005:Suche nach verschlüsselten Daten .