Типичният начин е да се съхранят както шифрованата стойност и еднопосочен хеш на стойността. Когато търсите конкретна стойност, ще търсите хеша. По този начин можете да правите заявки ефективно, без да се налага да декриптирате всеки ред, за да намерите стойността, която ви интересува:
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);
На теория можете да имате хеш конфликт веднъж на синя луна, за да се предпазите от параноя, добавяте двойна проверка на дешифрираната колона:
select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;
Вижте също Индексиране на шифровани данни и SQL Server 2005:търсене на криптирани данни .