|
Программирование >> Oracle
Пакет DBMS OBFUSCATION TOOLKIT 1677 Эти функции просто передают данные исходным функциям пакета DBMS OBFUSCATION TOOLKIT. При этом они, правда, не перегружены, что позволяет их использовать непосредственно в SQL-операторах. Следует помнить, что функции MD5 для больших объектов вычисляют контрольные суммы только по первым G CHUNKSIZE байтам данных. Это связано с ограничением языка PL/SQL на максимальный размер переменных. Теперь я продемонстрирую функциональные возможности пакета. Следующие примеры выполнялись на сервере Oracle 8.1.7. Такие примеры с использованием алгоритмов DES3 и MD5 в версии 8.1.6 не выполнятся. tkyte@DEV817> declare 2 l str data varchar2(25) := hello world; 3 l str enc varchar2(50); 4 l str decoded varchar2(25); 5 6 l raw data raw(25) :=utl raw.cast to raw(Goodbye); 7 l raw enc raw(50) ; 8 l raw decoded raw(25); 9 10 begin 11 crypt pkg.setkey(MagicKey); 13 l str enc := crypt pkg.encryptString(l str data); 14 l str decoded := crypt pkg.decryptString(l str enc); 16 dbros output.put line(Encoded In hex = 17 utl raw.cast to raw(l str enc)); 18 dbms output.put line(Decoded = l str decoded); 19 2 0 crypt pkg.setkey(utl raw.cast to raw(MagicKey)); 21 22 l raw enc := crypt pkg.encryptRaw(l raw data); 23 l raw decoded := crypt pkg.decryptRaw(l raw enc); 25 dbms output.put line(Encoded= l raw enc); 26 dbms output.put line(Decoded= 27 utl raw.cast tq varchar2(l raw decoded)); 28 end; 29 / Encoded In hex = 7004DB310AC6A8F210F8467278518CF9 88DF554B2 9 9B35EF Decoded = hello world Encoded = E3CC4E04EF3951178DEB9AFAE9C99096 Decoded = Goodbye PL/SQL procedure successfully completed. Этот пример демонстрирует базовые возможности функций ENCRYPT и DECRYPT. Здесь я вызывал их из PL/SQL, ниже мы будем вызывать их в SQL-операторах. Я протестировал работу со строками и данными типа RAW. B строке 11 кода я вызываю процедуру SETKEY для установки ключа шифрования, который будет использоваться при шифровании и дешифровании данных типа VARCHAR2, равным строке MAGICKEY. 1678 Приложение А Это позволяет не передавать строку остальным функциям. Затем я шифрую строку и помещаю результат в переменную L STR ENC. После этого строка дешифруется, чтобы убедиться, что все работает, как предполагалось. В строках 16-18 выдаются результаты. Поскольку в зашифрованных данных могут содержаться символы, сводящие с ума эмуляторы терминалов, я выдаю зашифрованную строку на терминал, вызвав UTL RAW.CAST TO RAW в строке 17. Тип данных меняется с VARCHAR2 на RAW. Сами данные при этом не меняются. Поскольку данные типа RAW неявно преобразуются в строку шестнадцатиричных цифр, этот прием можно использовать как удобный способ отображения на экране данных в шестнадцатиричном виде. В строках с 20 по 27 я делаю то же самое для данных типа RAW. Снова необходимо вызвать процедуру SETKEY, передав на этот раз 8 байт данных типа RAW. Для преобразования ключа типа VARCHAR2 в ключ типа RAW я использовал функцию UTL RAW.CAST TO RAW. Можно было также воспользоваться функцией HERAW и передать строку шестнадцатиричных цифр. Затем я шифрую данные и дешифрую результат. Зашифрованные данные выдаются в явном виде (они все равно будут отображаться в шестнадцатиричном представлении) и привожу тип расшифрованных данных снова к VARCHAR2, чтобы можно б1ло проверить корректность дешифровки. Результат подтверждает, что пакет работает. Рассмотрим, как этот пакет использовать в языке SQL. Для этого протестируем процесс шифрования тройным DES в режиме с двойным ключом: tkyte@DEV817>drop table t; Table dropped. tkyte@DEV817>create table t 2 (id int primary key, data varchar2(2 55)) ; Table created. tkyte@DEV817> insert into t values 2 (1, crypt pkg.encryptString(This is row 1, MagicKeyIsLonger)); 1 row created. tkyte@DEV817>insert into t values 2 (2, crypt pkg.encryptString( This is row2, MagicKeyIsLonger)); 1 row created. tkyte@DEV817> select utl raw.cast to raw(data) encrypted in hex, 2 crypt pkg.decryptString(data,MagicKeyIsLonger) decrypted 3 from t ENCRYPTED IN HEX DECRYPTED 0B9A809515519FA6A34F15094lB318OA441FBB0C790E9481 This is row 1 0B9A809515519FA6A34F150941B318DA20A936F9848ADC13 This is row 2 Итак, задав 16-байтовый ключ процедуре CRYPT PKG.ENCRYPTSTRING, мы автоматически переключились на использование процедуры DES3ENCRYPT пакета DBMS OBFUSCATION TOOLKIT. Этот пример показывает, насколько легко использовать средства пакета CRYPTPKG в языке SQL. Все функции можно непосредствен- Пакет DBMS OBFUSCATION TOOLKIT 1679 но вызывать в SQL-операторах в тех же конструкциях, что и, например, функцию SUBSTR. Средства пакета CRYPT PKG можно использовать в конструкции SET оператора UPDATE, в конструкции VALUES оператора INSERT, в списке выбора оператора SELECT и даже в конструкции WHERE любого оператора. Теперь посмотрим, как этот пакет можно использовать для больших объектов, продемонстрировав по ходу использование функций MD5. Для проверки используем объект типа CLOB размером 50 Кбайт. Сначала загружаем большой объект в базу данных: tkyte@DEV817> create table demo (id int, theClob clob); Table created. tkyte@DEV817> create or replace directory my files as 2 /d01/home/tkyte; Directory created. tkyte@DEV817> declare 2 l clob clob; 3 l bfile bfile; 4 begin 5 insert into demo values (1, erapty clob()) 6 returning theclob into l clob; 8 l bfile :=bfilename(MY FILES, htp.sql); 9 dbms lob.fileopen(l bfile); 10 11 dbms lob.loadfromfile(l clob, l bfile, 12 dbms lob.getlength(l bfile)); 13 14 dbms lob.fileclose(l bfile); 15 end; 16 / PL/SQL procedure successfully completed. Процедуры загрузили данные в объект типа CLOB. Теперь мы хотели бы выполнить с ним какие-нибудь действия. Снова используем язык SQL, поскольку это наиболее оптимальный способ работы с данными. Начнем с вычисления контрольной суммы по первым 32 Кбайтам данных объекта типа CLOB: tkyte@DEV817>selectdbms lob.getlength(theclob) lob len, 2 utl raw.cast to raw(crypt pkg.md51ob(theclob)) md5 checksum 3 from demo; LOB LEN MD5 CHECKSUM 50601 307D19748889C2DEAD879F89AD45DlBA Для того чтобы преобразовать перед выводом данные типа VARCHAR2, возвращаемые функциями MD5, в шестнадцатиричную строку, мы воспользовались функцией UTL RAW.CAST TO RAW. Строка типа VARCHAR2 скорее всего будет содержать встроенные символы новой строки, табуляции или другие управляющие символы терминала. Представленный выше код показывает, насколько легко использовать функции MD5: достаточно передать им данные, и контрольная сумма будет вычислена.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |