DeepEdit!

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

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

Алгоритм защищенного хеширования (Secure Hash Algorithm)

В пакете DBMS_OBFUSCATION_TOOLKIT криптографическое хеширование обеспечивается только функцией Message Digest (MD5), а не современными и надежными алгоритмами, такими как Secure Hash Algorithm 1 (SHA-1), поддерживаемый пакетом DBMS_CRYPTO.
Код аутентификации сообщения (Message Authentication Code)
Использование кода аутентификации сообщений (Message Authentication Code - MAC) позволяет создать хешированное значение для отправляемого сообщения. Впоследствии это значение можно сравнить со значением, вычисленным для сообщения при его получении, чтобы убедиться в целостности сообщения. Это процесс во многом похож на хеширование и отличается от него лишь тем, что для создания хеш-значения необходим ключ (как при шифровании). Пакет DBMS_OBFUSCATION_TOOLKIT не поддерживает создание MAC, а DBMS_CRYPTO поддерживает.
Большие объекты
Пакет DBMS_OBFUSCATION_TOOLKIT не поддерживает большие объекты (LOB) в их родном формате, а DBMS_CRYPTO поддерживает. Для шифрования LOB при работе со старым пакетом необходимо сначала преобразовать большие объекты к типу RAW, используя встроенный пакет UTL_RAW. Такой подход усложняет создание приложений.
В некоторых случаях вам придется использовать пакет DBMS_OB- FUSCATION_TOOLKIT даже при работе с Oracle 10g. Например, если приложение планируется использовать и в Oracle9i, и в Oracle 10g, то нужно будет пользоваться старым пакетом, так как его поддерживают обе версии. Аналогично, если вы зашифровываете в Oracle 10g данные, которые предполагается расшифровывать в Oracle9i, придется пользоваться DBMS_OBFUSCATION_TOOLKIT.
Генерирование ключей
Я уже говорил о том, что функция DES3GETKEY пакета DBMS_OBFUSCATION_ TOOLKIT, используемая для генерирования ключа шифрования, не дос-
тупна в пакете DBMS_CRYPTO. Вместо нее появляется функция RANDOMBYTES. Так что если вы захотите использовать нашу функцию get_key в Oracle 10g, вам придется изменить ее так, чтобы она работала с RANDOMBYTES.
При переходе от одного метода генерирования ключей к другому помните о следующих моментах:
Входящая в пакет DBMS_OBFUSCATION_TOOLKIT функция DES3GETKEY может сгенерировать ключ, относящийся к типу данных VARCHAR2 или RAW. В пакете DBMS_CRYPTO все шифрование, относящееся к VARCHAR2, реализуется через RAW, поэтому ключ типа VARCHAR2 бесполезен; функция RANDOMBYTES возвращает только ключи типа RAW.
Давайте посмотрим, как следует изменить функцию get_key так, чтобы она соответствовала новым условиям.
При работе с пакетом DBMS_CRYPTO нет необходимости в задании начального значения последовательности случайных чисел, как мы делали это в DBMS_OBFUSCATION_TOOLKIT. Функция получает такое начальное назначение из параметра SQLNET. CRYPTO_SEED файла SQL- NET.ORA. Соответственно, этот параметр должен иметь действительное значение, являющееся комбинацией символов длиной от 10 до 70 байт, например:
Обратите внимание на отсутствие параметра which. Кроме того, я указал длину генерируемого ключа, что важно для шифрования.
Может оказаться, что по умолчанию на пакет DBMS_CRYPTO не выданы права PUBLIC или для него не существует публичного синонима. Если вы хотите, чтобы все разработчики могли пользоваться пакетом DBMS_CRYPTO, проверьте наличие публичного синонима и соответствующих привилегий. Например, выполните от имени SYS такие операторы:
GRANT EXECUTE ON dbms_crypto TO PUBLIC; CREATE PUBLIC SYNONYM dbms_crypto FOR sys.dbms_crypto;
Имейте в виду, что если синоним уже существует, то исполнение оператора завершится с ошибкой, но никаких проблем для базы данных это не создаст.
Функция RANDOMBYTES чрезвычайно проста, так что вы можете посчитать, что нет необходимости в еще большем ее упрощении за счет создания функции-оболочки. Однако существует ряд причин, по которым вы все же можете захотеть поместить RANDOMBYTES внутрь нашей функции get_key:
Если существующий код уже использует функцию get_key, то необходимо обеспечить обратную совместимость.
Для того чтобы напечатать название «get_key», необходимо меньше символов, что повышает читабельность кода.
Единообразие обычно способствует повышению качества кода, одной этой причины достаточно для того, чтобы использовать функцию-оболочку.
Функция RANDOMNUMBER генерирует ключ целочисленного типа длиной
2128:
В дополнение к генерированию ключей в формате RAW (посредством функции RANDOMBYTES) пакет DBMS_CRYPTO обеспечивает формирование числовых значений, а также двоичных целых. Функция RANDOMINTEGER генерирует двоичный целый ключ, например:

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









jAntivirus