sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-krypterade kolumner i WHERE-sats

Det typiska sättet är att lagra både det krypterade värdet och en enkelriktad hash av värdet. När du söker efter ett specifikt värde, skulle du söka efter hashen. På så sätt kan du fråga effektivt, utan att behöva dekryptera varje rad för att hitta det värde du är intresserad av:

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);

I teorin kan du ha en hash-konflikt en gång i en blå måne, för att vara paranoid-säker lägger du till en dubbelkoll på den dekrypterade kolumnen:

select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;

Se även Indexering av krypterad data och SQL Server 2005:sökning av krypterad data .



  1. VÄLJA data från flera tabeller?

  2. Skillnaden mellan ON- och WHERE-satser i SQL-tabellen ansluter

  3. Kontrollera vilka ID:n från en uppsättning som inte finns i en tabell

  4. Liquibase/PostgreSQL:hur bevarar man tabellväxeln korrekt?