Il modo tipico è memorizzare sia il valore crittografato che un hash unidirezionale del valore. Quando cerchi un valore specifico, cercherai l'hash. In questo modo puoi eseguire query in modo efficiente, senza dover decifrare ogni riga per trovare il valore che ti interessa:
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);
In teoria, puoi avere un conflitto di hash una volta in una luna blu, per essere paranoico aggiungi un doppio controllo sulla colonna decifrata:
select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;
Vedi anche Indicizzazione dei dati crittografati e SQL Server 2005:ricerca di dati crittografati .