Столбцы с шифрованием SQL в предложении WHERE - PullRequest
12 голосов
/ 25 августа 2010

Я хочу применить шифрование на уровне столбцов SQL с использованием симметричных ключей.Начальные шаги, необходимые для создания главного ключа базы данных, сертификатов и симметричных ключей, кажутся простыми, и я успешно протестировал шифрование / дешифрование данных с использованием симметричных ключей.

Однако, как только данные зашифрованы, я не знаю, каклучше всего запросить это.Например,

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE CONVERT(varchar, DECRYPTBYKEY(EncyptedColumn)) = @SearchTerm

наверняка приведет к полному сканированию таблицы?

Другой вариант, который, как мне показалось, может сработать, это сначала зашифровать критерии поиска, например,

SELECT PlainTextA, PlainTextB, PlainTextC 
WHERE EncyptedColumn = ENCRYPTBYKEY(KEY_GUID('KeyName'), @SearchTerm)

, но этоне работает, поскольку сгенерированное зашифрованное значение всегда отличается.

Любые предложения будут приняты с благодарностью.

Ответы [ 3 ]

14 голосов
/ 25 августа 2010

Типичным способом является сохранение зашифрованного значения и одностороннего хеш-значения. Когда вы ищете конкретную ценность, вы будете искать хэш. Таким образом, вы можете выполнять эффективный запрос, без необходимости расшифровывать каждую строку, чтобы найти интересующее вас значение:

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

Теоретически, вы можете иметь конфликт хэшей один раз на голубой луне, чтобы быть параноидальным, вы добавляете двойную проверку в расшифрованном столбце:

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

Также см. Индексирование зашифрованных данных и SQL Server 2005: поиск зашифрованных данных .

2 голосов
/ 25 августа 2010

Один из вариантов, который у вас есть, - это добавить новый столбец в таблицу (или иметь представление WITH SCHEMABINDING с вычисляемым столбцом в нем и индексировать его) с односторонним HASH поискового значения. Это не обязательно должен быть сильный хеш - что-то столь же простое, как CHECKSUM, будет работать . Затем вы хэшируете значение поиска в своем поиске и фильтруете его по хешу, который проиндексирован. Таким образом, вы можете предоставить что-то доступное для поиска и индексирования, фактически не выставляя само значение.

Однако, если есть другой способ сделать это напрямую, я бы хотел знать, что это такое:)

0 голосов
/ 13 июля 2015

Другим вариантом является использование представления, которое содержит столбец расшифрованного значения и поиск записей в соответствии с ним.

SELECT PlainTextA, PlainTextB, PlainTextC from TheView 
WHERE DecryptedColumn = @SearchTerm
...