Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Colonnes cryptées SQL dans la clause WHERE

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 .