La manière typique est de stocker à la fois la valeur chiffrée et un hachage unidirectionnel de la valeur. Lorsque vous recherchez une valeur spécifique, vous recherchez le hachage. De cette façon, vous pouvez interroger efficacement, sans avoir à déchiffrer chaque ligne afin de trouver la valeur qui vous intéresse :
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 théorie, vous pouvez avoir un conflit de hachage une fois dans une lune bleue, pour être paranoïaque, vous ajoutez une double vérification sur la colonne déchiffrée :
select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;
Voir également Indexation des données chiffrées et SQL Server 2005 :recherche de données chiffrées .