DeepEdit!

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

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

Обработка и преобразование данных типа RAW

Приведенная выше функция принимает входные значения типа RAW и предполагает, что вы хотите использовать алгоритм шифрования AES со 128-битным ключом, метод дополнения PKCS#5 и сцепление блоков шифротекста. В реальных приложениях такие ограничения могут оказаться не очень удобными. Например, входные значения обычно имеют формат VARCHAR2 или какой-то числовой формат, а совсем не RAW. Давайте сделаем функцию более общей, обеспечив прием входных значений в формате VARCHAR2 вместо RAW. Функция ENCRYPT принимает входные значения в формате RAW, так что исходные данные придется преобразовывать к типу RAW. Сделаем следующее:

Может быть, вы помните, что ранее в главе я использовал встроенный пакет UTL_RAW для преобразования значений типа VARCHAR в RAW. В данном случае я использую для такого преобразования функцию UTL_I18N. STRING_TO_RAW, а не UTL_RAW. CAST_TO_RAW. Почему?
Функция ENCRYPT принимает на вход значения типа RAW и, кроме того, требует использования специального набора символов AL32UTF8, ко-
торый не обязательно является набором символов базы данных. Так что фактически необходимо выполнить два преобразования:
Из текущего набора символов базы данных в набор символов AL32UTF8
Из VARCHAR2 в RAW
Функция CAST_TO_RAW не умеет выполнять преобразование набора символов, а функция STRING_TO_RAW встроенного пакета UTL_i18n может выполнить оба преобразования.
Пакет UTL_i18n поставляется в составе Oracle Globalization Support и используется для обеспечения глобализации (или интернационализации - internationalization, это англ. слово обычно сокращают как «i18n»: первая буква «i», последняя буква «n» и 18 букв между ними). Подробно о PL/SQL и интернационализации рассказано в главе 24 четвертого издания «Oracle PL/SQL Programming» (Программирование на Oracle PL/SQL).
Функция ENCRYPT возвращает значение типа RAW, которое неудобно хра нить в базе данных и обрабатывать. Преобразуем его из RAW в VARCHAR2:

Выбор алгоритма шифрования
Как вы помните, выбор алгоритма шифрования определяется рядом факторов, например переходом от Oracle9/ к Oracle 10g\ Если источником или местом назначения зашифрованных данных является Orac- le9t, у вас не будет доступа к пакету DBMS_CRYPTO. Придется использовать пакет DBMS_OBFUSCATION_TOOLKIT, который не поддерживает алгоритмы AES. Так что, несмотря на всю надежность и эффективность алгоритмов AES, вам придется воспользоваться чем-то другим, например DES. Для обеспечения дополнительной безопасности можно использовать 3DES (но имейте в виду, что он медленнее DES). Во многих случаях вам придется для удовлетворения разным требованиям выбирать разные алгоритмы шифрования, при том что две другие опции: дополнение и сцепление, будут оставаться неизменными. К сожалению, функция ENCRYPT не позволяет определить тип шифрования напрямую; он должен передаваться в параметре наряду с другими опциями (типами дополнения и сцепления).
Но мы можем сделать это самостоятельно, введя новый параметр (p_algorithm) и включив его в пользовательский пакет шифрования. Этот параметр будет принимать значения только из следующего списка, в котором перечислены алгоритмы шифрования, поддерживаемые DBMS_CRYPTO:


Переданное значение будет дописано в конец слова «ENCRYPT» и передано функции ENCRYPT:

Сводим воедино
Объединим все сделанное ранее: теперь функция get_enc_val будет вы глядеть следующим образом:
Мы создали общую функцию шифрования, которая может (необязательно) принимать на вход алгоритм шифрования и вектор инициализации. Она предполагает использование дополнения по системе PKCS#5 и сцепления по электронной книге кодов, что является общей практикой. Если вам подходят такие характеристики шифрования, то эта программа может стать вашей оболочкой для выполнения рутинных операций шифрования.
Расшифровывание данных
Обратная задача - процесс расшифровывания, при котором зашифрованная строка расшифровывается с помощью того же ключа, который был использован для шифрования. Давайте напишем для расшифровывания новую функцию, get_dec_val, используя пакет DBMS_CRYPTO.


Протестируем функцию, попытавшись расшифровать ранее зашифрованное значение:

Test

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









jAntivirus