2010-03-22 2 views
2

У меня есть таблица, называемая tblClient с зашифрованным столбцом SSN.Оптимизация поиска в зашифрованном столбце

В соответствии с политикой компании мы зашифровали SSN с использованием симметричного ключа (выбранного по асимметричному ключу по причинам производительности) с использованием пароля.

Вот неполный LIKE поиск по SSN объявить @SSN VARCHAR (11) набор @SSN = '111-22-%'

open symmetric key SSN_KEY decrypt by password = 'secret' 

    select Client_ID 
    from tblClient (nolock) 
    where convert(nvarchar(11), DECRYPTBYKEY(SSN)) like @SSN 

close symmetric key SSN_KEY 

Перед шифрованием, поиск через 150000 записей приняли менее секунд.
, но с сочетанием дешифрования тот же поиск занимает около секунд.

Какую стратегию я могу применить, чтобы попытаться оптимизировать поиск через зашифрованный столбец?

+0

Является ли шифрование детерминированным или рандомизированным? То есть если один и тот же SSN зашифрован несколько раз, всегда ли он дает один и тот же шифротекст? – abc

+0

@abc: рандомизированное (недетерминированное) – Sung

ответ

3

Простым решением является добавление незашифрованного столбца для первых символов SSN. И this is the hard one.

+0

Я прочитал статью и добавил новый столбец, содержащий хэш значения orignal, и поиск выполняется через хэш-столбец. Спасибо oleksy.t – Sung

+0

+1 Мне не нравится простое решение. Но связанная статья - действительно хорошая запись плюсов и минусов различных решений. Например. добавление хеша для индексирования отбрасывает некоторые преимущества использования недетерминированного шифрования. – Accipitridae

1

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

+0

SSN в формате varbinary, поэтому его нельзя индексировать. – Sung

3

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

Оптимизируйте вместо этого предварительное шифрование значений (-ов) поиска, чтобы разрешить индексирование зашифрованных значений.

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

select Client_ID 
from tblClient (nolock) 
where SSN = convert(nvarchar(11), ENCRYPTBYKEY(@SSN)) 

... Однако для поиска, вы можете искать в оптимизации такого рода достигает этого путем размещения сегментов ССН в отдельные индексируемой полей, то разбор входной строки, и делать

select Client_ID 
from tblClient (nolock) 
where SSNFIRST3 = convert(nvarchar(3), ENCRYPTBYKEY(<parsed prefix here>)) 
and SSNSECOND2 = convert(nvarchar(2), ENCRYPTBYKEY(<parsed middle section here>)) 

Вы только делаете шифрование/дешифрование на I nput, а не строки.

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

EDIT: Я имел в виду ENCRYPTBYKEY, измененный выше.

+0

Позвольте мне попробовать этот подход. – Sung

+1

Сравнение с использованием зашифрованного ключа не сработало. По некоторым причинам значения зашифрованных столбцов и зашифрованное входное значение не совпадают. (Как я читаю ответ oleksiy.t (http: // stackoverflow.com/questions/2496398/optimizing-encrypted-column-search/2496490 # 2496490), оказывается, что 'DecryptByKey' не является детерминированным (каждый раз возвращает различное значение), поэтому шифрование входного SSN не будет работать и не работает. – Sung

Смежные вопросы