|
Программирование >> Oracle
Пакет DBMS OBFUSCATION TOOLKIT 1665 ства других требований. А вот обеспечение длины ключа 8, 16 или 24 байт должен взять на себя разработчик. Я собираюсь представить здесь пакет-оболочку, который будет работать в версиях 8.1.6 и выше, поддерживать все возможности шифрования и обеспечивать: возможность вызова функций в SQL-операторах; использование одной и той же функции независимо от длины ключа; возможность шифрования/дешифрования больших объектов в PL/SQL и в SQL- операторах; успешную установку независимо от используемой версии сервера (8.1.6 или 8.1.7) - другими словами, независимость от наличия процедур DES3Encrypt/Decrypt и поддержки алгоритма MD5. Пакет-оболочка Начнем со спецификации пакета. Зададим функциональный интерфейс, обеспечивающий шифрование и дешифрование данных типа VARCHAR, RAW, BLOB и CLOB. Используемый алгоритм (DES или 3DES с 16- или 24-байтовым ключом) будет выбираться в зависимости от длины ключа. В нашем интерфейсе длина ключа будет задавать алгоритм. Интерфейс устроен так, что ключ можно передавать при каждом вызове или установить на уровне пакета с помощью подпрограммы SETKEY. Преимущество использования подпрограммы SETKEY связано с тем, что проверка длины ключа и определение соответствующего алгоритма требует определенных ресурсов. Если ключ устанавливается один раз, а функции шифрования вызываются многократно, можно избежать повторного выполнения одних и тех же действий. Еще одна особенность при задании ключа состоит в том, что при работе с данными типа RAW или BLOB надо использовать ключ типа RAW. Если в качестве ключа для данных типа RAW/BLOB желательно использовать данные типа VARCHAR2, необходимо привести ключ к типу RAW c помощью средств пакета UTL RAW, который рассматривается далее в этом приложении. С другой стороны, при работе с данными типа VARCHAR2 и CLOB, ключ должен быть типа VARCHAR2. Помимо организации дополнительного уровня интерфейса к средствам шифрования этот пакет обеспечивает доступ к подпрограммам CHECKSUM c алгоритмом MD5, если они установлены (используется сервер версии 8.1.7 и выше). Этот пакет-оболочка добавляет несколько возможных сообщений об ошибках к тем, что имеются в пакете DBMS OBFUSCATION TOOLKIT и описаны в документации (эти сообщения наш пакет просто передает вызывающему). В процессе работы с сервером версии 8.1.6 выдаются такие, не известные ранее сообщения: PLS-00302: component MD5 must be declared PLS-00302: component DES3ENCRYPT must be declared PLS-00302: component THREEKEYMODE must be declared 1666 Приложение А Эти сообщения об ошибках генерируются при попытке использовать средства версии 8.1.7, шифрование по алгоритму DES3 или хеширование с помощью алгоритма MD5, на сервере версии 8.1.6. Вот предполагаемая спецификация пакета-оболочки. Описание процедур и функций представлено после кода: create or replace package crypt pkg as function encryptString(p data in varchar2, p key in varchar2 default NULL) return varchar2; function decryptString(p data in varchar2, p key in varchar2 default NULL) return varchar2; function encryptRaw(p data in raw, p key in raw default NULL) return ra; function decryptRaw(p data in raw, p key in raw default NULL) return ra; function encryptLob(p data in clob, p key in varchar2 default NULL) return clob; function encryptLob(p data in blob, p key in raw default NULL) return blob; function decryptLob(p data in clob, p key in varchar2 default NULL) return clob; function decryptLob(p data in blob, p key in raw default NULL) return blob; subtype checksum str is varchar2(16); subtype checksum raw is raw(16); function md5str(p data in varchar2) return checksum str; function md5raw(p data in raw) return checksum raw; function md51ob(p data in clob) return checksum str; function md51ob(p data in blob) return checksuro raw; procedure setKey(p key in varchar2); end; Функции ENCRYPTSTRING и DECRYPTSTRING используются для шифрования/ дешифрования любых данных типа STRING, DATE или NUMBER длинной до 32 Кбайт. Максимальный размер PL/SQL-переменной - 32 Кбайт, что существенно прев1шает максимальный размер строки, сохраняемой в базе данных, - 4000 байт. Эти функции можно вызывать непосредственно из SQL-операторов, так что, можно шифровать данные в базе с помощью операторов INSERT или UPDATE и выбирать уже расшифрованные данные с помощью оператора SELECT. Параметр KEY - необязательный. Если ключ установлен с помощью процедуры SETKEY, передавать его при каждом вызове необязательно. Имеются также функции ENCRYPTRAW и DECRYPTRAW. Они реализуют для данных типа RAW те же возможности, что и функции для данных типа VARCHAR2. Я намеренно избегаю перегрузки функций шифрования/дешифрования для данных типа и VARCHAR2, давая им разные имена. Это делается для того, чтобы избежать следующей проблемы: Пакет DBMS OBFUSCATION TOOLKIT 1667 tkyte8TKYTE816> create or replace package overloaded 2 as 3 function foo(x in varchar2) return number; 4 function foo(x in raw) return number; 5 end; Package created. tkyte@TKYTE816>selectoverloaded.foo(hello ) from dual; select overloaded.foo(hello ) from dual ERROR at line 1: ORA-06553: PLS-307: too many declarations of P001 match this call tkyte@TKYTE816>selectoverloaded.foo(hextoraw(aa)) from dual; select overloaded.foo ( hextoraw(aa)) from dual * ERROR at line 1: ORA-06553: PLS-307: too many declarations of F00 match this call Сервер не различает типы данных RAW и VARCHAR2 в сигнатурах перегруженн1х функций. Вызвать эти функции в SQL-операторах невозможно. Даже если использовать другие имена параметров функций (как в пакете DBMS OBFUSCATlON TOOLKIT), нельзя вызвать эти функции из SQL-операторов, поскольку ключевая передача параметров в языке SQL не поддерживается. Единственно возможное решение - использовать функции с уникальными именами для идентификации необходимого типа данных параметра. Функции ENCRYPTLOB и DECRYPTLOB - это перегруженные функции, предназначенные для работы с данными типа CLOB или BLOB. Сервер Oracle позволяет различать эти типы в сигнатурах, и этим можно воспользоваться. Поскольку нельзя шифровать более 32 Кбайт с помощью подпрограмм пакета DBMS OBFUSCATION TOOLKIT, эти функции будут использовать алгоритм шифрования больших объектов частями по 32 Кбайт. Полученный большой объект будет представлять собой набор зашифрованных фрагментов данных размером по 32 Кбайт. Оболочка дешифрования, которую мы реализуем, учитывает упаковку данных подпрограммами шифрования больших объектов, дешифруя фрагменты и собирая из них исходный большой объект. Затем в пакете идут подпрограммы для вычисления контрольных сумм по алгоритму MD5. Чтобы точнее задать тип возвращаемых ими значений, я создал подтипы: subtype checksum str is varchar2(16); subtype checksum raw is raw(16); и указал, что эти функции возвращают именно эти типы. Пользователи пакета могут объявлять переменные этих типов: tkyte@TKYTE816> declare 2 checksum variable crypt pkg.checksum str; 3 begin 4 null; 5 end;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |