Приведенная выше функция принимает входные значения типа 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
Функция 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» ранее в главе).
< Предыдущая | Следующая > |
---|