Я хочу применить шифрование на уровне столбцов SQL с использованием симметричных ключей. Первые шаги, необходимые для создания главного ключа базы данных, сертификатов и симметричных ключей, кажутся простыми, и я успешно протестировал шифрование / дешифрование данных с использованием симметричных ключей.
Однако, как только данные зашифрованы, я не знаю, как лучше их запросить. Например.
SELECT PlainTextA, PlainTextB, PlainTextC
WHERE CONVERT(varchar, DECRYPTBYKEY(EncyptedColumn)) = @SearchTerm
обязательно приведет к полному сканированию таблицы?
Другой вариант, который, как я думал, может сработать, - это сначала зашифровать критерии поиска, например
SELECT PlainTextA, PlainTextB, PlainTextC
WHERE EncyptedColumn = ENCRYPTBYKEY(KEY_GUID('KeyName'), @SearchTerm)
, но это не работает, поскольку генерируемое зашифрованное значение всегда разное.
Мы будем очень благодарны за любые предложения.
Один из вариантов - добавить новый столбец в таблицу (или иметь представление WITH SCHEMABINDING
с вычисляемым столбцом в нем и проиндексировать его) с односторонним хешем значения поиска. Это не обязательно должен быть сильный хэш - что-то более простое, как CHECKSUM, будет работать . Затем вы хешируете поисковое значение в вашем поиске и фильтруете его по хешу, который индексируется. Таким образом, вы можете предоставить доступ к чему-либо с возможностью поиска и индексации, не раскрывая при этом само значение.
Однако, если есть другой способ сделать это напрямую, я хотел бы знать, что это такое :)