DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Дополнение и сцепление

В процессе шифрования фрагмент данных не обрабатывается целиком. Обычно он разбивается на блоки по 8 байт, каждый из которых обрабатывается независимо. Конечно, длина такого блока не обязательно кратна восьми; в таком случае алгоритм добавляет недостающие символы в последнюю порцию, удлиняя ее ровно до 8 байт. Такой процесс называется дополнением. Дополнение должно производиться так, чтобы взломщик не мог определить, что именно было добавлено, и использовать эти знания для взлома ключа шифрования. Чтобы введение заполнителя не влияло на безопасность, можно воспользоваться доступным в Oracle готовым методом дополнения Public Key Crypto
graphy System #5 (PKCS#5). Есть еще несколько режимов, позволяющих выполнять дополнение нолями или не использовать заполнители вовсе. Позже в этой главе мы покажем, как использовать заполнители, указывая параметры или выбирая константы встроенных пакетов Oracle.
Так как данные делятся на блоки, необходим способ соединения этих блоков обратно. Этот процесс называется сцеплением. Надежность системы шифрования в целом зависит от того, как соединяются и зашифровываются блоки - по отдельности или совместно с соседними блоками. Oracle поддерживает следующие методы сцепления:
CBC
Cipher Block Chaining - сцепление блоков шифротекста, наиболее распространенный метод сцепления.
ECB
Electronic Code Book - электронная кодовая книга. C FB
Cipher Feedback - обратная связь по шифротексту. OFB
Output Feedback - обратная связь по выводу.
Ниже мы рассмотрим, как использовать эти методы, выбирая параметры и константы во встроенных пакетах Oracle.
Шифрование в Oracle9i
Давайте начнем подробное обсуждение шифрования в Oracle с обзора пакета DBMS_OBFUSCATION_TOOLKIT. Несмотря на то что сейчас Oracle рекомендует пользоваться более новым пакетом DBMS_CRYPTO, большинство организаций еще не перевели на него свои приложения, поэтому есть смысл начать с более старого пакета.
Если вы работаете с Oracle 10g и начинаете новый проект, то, вероятно, захотите использовать возможности, описанные в раз- f ^Г; деле «Шифрование в Oracle 10g». Однако чтобы уверенно ориентироваться в основных понятиях шифрования, вам, возможно, будет полезно прочитать сначала этот раздел.
Шифрование данных
Пора посмотреть на шифрование в Oracle в действии. Приведем простой пример, а затем рассмотрим его подробно. Предположим, вы хотите получить зашифрованное представление строки «SHHH..TOP SECRET». Это делается следующим фрагментом кода, в котором вызывается процедура DES3ENCRYPT пакета DBMS_OBSFUSCATION_TOOLKIT:
Результат выглядит так:
Теперь наш PL/SQL-блок выглядит так:
Получим такой результат:
В строке 6 указан ключ, используемый для шифрования исходного значения, длина этого ключа равна 16 символам. Зашифрованное значение имеет тип VARCHAR2, но содержит управляющие символы. В таком виде результат мало полезен в реальных приложениях, особенно если вы собираетесь его хранить, распечатывать или сообщать кому- нибудь; вероятно, имеет смысл сделать его более удобным, преобразовав к печатному виду. Заметьте, однако, что приведение данных к типу RAW и обратно не всегда желательно; ниже это обсуждается во врезке «Когда следует использовать шифрование в формате RAW?». Наша первая задача заключается в преобразовании к типу данных RAW при помощи встроенного пакета UTL_RAW.

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

Основываясь на программах шифрования из пакета DBMS_OBFUSCATI- ON_TOOLKIT, напишем несколько функций-оберток, чтобы сделать процесс шифрования более простым и гибким.
В этом примере вызывается процедура DES3ENCRYPT, выполняющая шифрование по алгоритму Triple DES. Семейство ENCRYPT включает в себя ряд других процедур и функций, полные спецификации которых приведены в приложении A.

Использовав эту функцию в предыдущем примере, получим искомый результат.

Конечно, реальное значение, полученное в вашей системе, может быть другим вследствие использования другого набора символов; это очень важный момент, к которому мы еще вернемся. Данную функцию шифрования вы можете использовать разными способами - для встав-
ки данных в зашифрованные столбцы, передачи зашифрованных данных в другие процедуры и функции и т. п.
Что-то не так. На этот раз возникает ошибка.
Прежде чем двигаться дальше, протестируем нашу функцию на разных входных значениях. В первом примере мы зашифровывали строку «SHHH. .TOP SECRET». Теперь зашифруем другое значение:
Что здесь неправильно? Единственное, что изменилось, - это входная строка: в первый раз она имела длину 16 символов, а теперь мы передаем 17. Оказывается, длина входной строки в процедуре DES3ENCRYPT должна быть в точности кратна восьми; если это не так, возникает исключение с кодом ошибки ORA-28232. При данном типе шифрования, известном как блочное шифрование, программа обрабатывает данные поблочно (а блок состоит из восьми символов). Если длина входного значения не кратна восьми, строка должна быть дополнена до этой длины, как уже говорилось в разделе «Дополнение и сцепление». Внутри функции можно легко привести входную строку к требуемой длине:

END; /
Единственное отличие этого варианта функции в том, что входная строка дополняется справа пробелами до длины, кратной восьми. С помощью этой функции вы можете зашифровывать строки любой длины.
Если вы используете пакет DBMS_CRYPTO в Oracle 10g, вам не надо самим выравнивать входное значение; дополнение осуществляется в пакете. Как уже говорилось, в этом пакете расширен выбор алгоритмов шифрования и методов дополнения и сцепления.
 









jAntivirus