Cách thông thường là lưu trữ cả giá trị được mã hóa và hàm băm một chiều của giá trị. Khi bạn tìm kiếm một giá trị cụ thể, bạn sẽ tìm kiếm hàm băm. Bằng cách này, bạn có thể truy vấn hiệu quả, không cần phải giải mã mọi hàng để tìm giá trị bạn quan tâm:
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);
Về lý thuyết, bạn có thể xảy ra xung đột băm một lần trong một lần trăng xanh, để an toàn cho người hoang tưởng, bạn hãy thêm kiểm tra kỹ vào cột được giải mã:
select PlainA, plainB, PlainC
from table
where HashValue = HashBytes('SHA1', @searchTerm)
and DecryptByKey(..., EncryptedColumn) = @searchTerm;
Cũng xem Lập chỉ mục dữ liệu được mã hóa và SQL Server 2005:tìm kiếm dữ liệu được mã hóa .