Индексируйте столбец, зашифрованный с помощью pkg_crypto - PullRequest
2 голосов
/ 14 января 2012

Я работаю над проектом, который использует pkg_crypto для защиты личной информации пользователей.Есть несколько тысяч строк (которые, как ожидается, вырастут до нескольких десятков тысяч), и всякий раз, когда я использую в запросе предложение WHERE или ORDER BY, вся таблица дешифруется перед возвратом результатов.Это займет несколько секунд для одного запроса, который пригоден для разработки, но, вероятно, не очень хорош для выпуска.

Есть ли способ создать индекс, который будет работать с зашифрованными столбцами без ущерба для безопасности?

Вставки и выделения выглядят примерно так (с iBatis):

вставка:

INSERT INTO "USER_TABLE" 
(
"ID"
,"LOGIN"
,"PASSWORD"
,"NAME"
,"EMAIL"
)
VALUES
(
user_table_seq.nextval, 
#login#
,#password#
,pkg_crypto.encrypt(#name#, 'key')
,pkg_crypto.encrypt(#email#, 'key') 
)

выберите:

SELECT 
"ID"
,"LOGIN"
,"PASSWORD"
,pkg_crypto.decrypt("NAME", 'key') NAME
,pkg_crypto.decrypt("EMAIL", 'key')  EMAIL
FROM "USER_TABLE"
WHERE pkg_crypto.decrypt("NAME", 'key') LIKE #name# || '%'
AND pkg_crypto.decrypt("EMAIL", 'key') LIKE '%' || #email#

Я упреждаю, что сервлет хеширует пароль перед передачей в базу данных.

Ответы [ 2 ]

4 голосов
/ 14 января 2012

Вам нужно использовать PKG_CRYPTO для шифрования данных (что, как я полагаю, является тем, что вы написали, которое вызывает либо DBMS_CRYPTO, либо DBMS_OBFUSCATION_TOOLKIT?) Oracle имеет функцию под названием прозрачное шифрование данных (TDE) (хотя это дополнительная опция), которая позволит Oracle прозрачно шифровать данные на диске, расшифровывать их при чтении с диска, а затем использовать такой предикат LIKE для ваших данных.

3 голосов
/ 14 января 2012

По существу, ответом является Нет .

Когда каждое значение зашифровано, для него выбирается случайный IV (вектор инициализации), выбранный для него.А это значит, что вы не можете предсказать, что входит в индекс.Если вы повторно зашифруете значение (даже с тем же ключом), вы получите другой результат.Поэтому вы не можете сознательно использовать индекс для зашифрованного значения, потому что вы не можете воспроизвести шифрование для значения, которое вы ищете.В любом случае индекс будет полезен только для поиска на равенство.Данные будут в случайной последовательности.

Возможно, вам лучше справиться с сохраненным хеш-значением (а также зашифрованным значением).Если вы хэшируете имена с помощью известного алгоритма, вы можете воспроизвести значение хеш-функции по требованию и найти подходящие строки.Но простое знание хеша не позволит вам (или нарушителю) определить значение, которое было хэшировано, кроме как с помощью предварительно вычисленных «радужных таблиц».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...