La forma habitual es almacenar el valor cifrado y un hash unidireccional del valor. Cuando busca un valor específico, buscaría el hash. De esta manera, puede realizar consultas de manera eficiente, sin tener que descifrar cada fila para encontrar el valor que le interesa:
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);
En teoría, puede tener un conflicto hash una vez cada luna azul, para estar seguro paranoico, agregue una doble verificación en la columna descifrada:
select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;
Consulte también Indización de datos cifrados y SQL Server 2005:búsqueda de datos cifrados .