Программирование >>  Oracle 

1 ... 413 414 415 [ 416 ] 417 418 419 ... 469


Пакет DBMS OBFUSCATION TOOLKIT 1671

Теперь рассмотрим первую общедоступную процедуру, SETKEY:

procedure setKey(p key in varchar2) as

begin

if (g charkey = p key OR p key is NULL) then

return; end if;

g charkey := p key;

if (length(g charkey) not in (8, 16, 24, 16, 32, 48)) then

raise application error(-2 0001,

Key must be 8, 16, or 24 bytes);

end if;

select decode(length(g charkey),8 3), decode(length(g charkey),8 16

24, , which=>dbms obfuscation toolkit.ThreeKeyMode), decode(length(g charkey),16, , 3) , decode(length(g charkey),16 32

48 which=>dbms obfuscation toolkit.ThreeKeyMode) into g stringFunction, g stringWhich, g rawFunction, g rawWhich from dual;

end;

Процедура используется независимо от того, вызывали вы ее или нет. Остальные общедоступные подпрограммы вызывают процедуру SETKEY всегда. Она сравнивает переданный ключ P KEY с тем, что хранится в глобальной переменной G CHARKEY. Если они совпадают или ключ не задан, процедура завершает работу. Если же значение P KEY отличается от значения G CHARKEY, процедура продолжит работу. Сначала она проверит, допустима ли длина ключа и кратна ли 8. Ключ должен быть длиной 8, 16 или 24 байт. Поскольку процедуре могут быть переданы данные типа RAW, что вызывает представление каждого байта двухбайтовым шестнадцатиричным кодом, допускается также длина ключа 16, 32 и 48. Такая проверка, однако, не гарантирует, что ключ можно использовать. Например, можно передать четырехбайтовый ключ типа RAW, который в процедуре будет иметь длину 8 байт. В этом случае при дальнейшем выполнении подпрограмм пакета DBMS OBFUSCATION TOOLKIT будет получено сообщение об ошибке.

Оператор SELECT с функцией DECODE используется для установки значений остальных глобальных переменных. Поскольку мы пока не можем различить типы дан-н1х RAW и VARCHAR2, то устанавливаем значения всем четырем переменным. Главное в этом фрагменте кода то, что если длина ключа - 8 байт (16 байт, если он типа RAW), то переменная FUNCTION получит значение пустой строки. Если же длина ключа - 16 или 24 байт (32 или 48 байт для ключа типа RAW), в переменную FUNCTION записывается строка 3. Именно это в дальнейшем позволит вызвать подпрограмму DESENCRYPT или DES3Encrypt. Обратите внимание также на установку значения глобальной переменной WHICH. Она используется для передачи необязательного параметра подпрограмме DES3ENCRYPT. Если длина ключа - 8 или 16 байт (16 или 32 байта для ключа типа RAW), переменная получает значение Null, - параметр не передается. Если



1672 Приложение А

длина ключа - 24 байта (48 байт для ключа типа RAW), она получает значение THREEKEYMODE, требующее от процедур ENCRYPT/DECRYPT использовать ключ большего размера.

Теперь мы готовы к рассмотрению функций, выполняющих основные действия:

function encryptString(p data in varchar2 ,

p key in varchar2 default NULL) return varchar2

l encrypted long; begin

setkey(p key); execute immediate begin

dbms obfuscation toolkit.des g StringFunction encrypt (input string => :1, key string => :2, encrypted string => :3 g stringWhich ) ; end;

using IN padstr(p data), IN g charkey, IN OUT l encrypted; return l encrypted;

end;

function encryptRaw(p data in raw,

p key in raw default NULL) return raw

l encrypted long raw; begin

setkey(p key); execute immediate begin

dbms obfuscation toolkit.des g RawFunction encrypt (input => :1, key => :2, encrypted data => :3 g rawWhich ) ; end;

using IN padraw(p data), IN hextoraw(g charkey), IN OUT l encrypted; return l encrypted;

end;

Функции ENCRYPTSTRING и ENCRYPTRAW действуют одинаково. Они обе динамически вызывают процедуру DESENCRYPT либо DES3ENCRYPT. Этот динамический вызов не только сокращает объем необходимого кода (поскольку избавляют от оператора IF THEN ELSE для статического вызова процедур), но и позволяют устанавливать пакет без изменений в версии 8.1.6 или 8.1.7. Поскольку мы не ссылаемся на подпрограммы пакета DBMS OBFUSCATION TOOLKIT статически, то сможем скомпилировать функцию в любой версии. Этот прием с динамическим вызовом пригодится в том случае, когда точно не известно, что будет установлено в базе данных. Я использовал его ранее при написании утилит, которые должны были устанавливаться на серверах версии 7.3, 8.0 и 8.1. Со временем в базовых пакетах появляются новые функции, и, если код работает в версии 8.1, хотелось бы их использовать. В версии 7.3 код тоже будет работать; в нем просто нельзя будет использовать новые функциональные возможное-



Пакет DBMS OBFUSCATION TOOLKIT 1673

ти. В нашем случае именно так и происходит. При установке пакета на сервере версии 8.1.7 представленный выше код будет вызывать процедуру DES3ENCRYPT. При установке пакета на сервере версии 8.1.6любая попытка вызвать процедуру DES3ENCRYPT приведет к ошибке времени выполнения (но не помешает установить пакет). Вызовы процедуры DESENCRYPT будут работать так же, как в версии 8.1.6.

Эти функции динамически формируют строку на основе значений глобальных пере-менн1х FUNCTION и WHICH, которые мы установили в процедуре SETKEY. Мы либо добавим цифру 3 к имени процедуры, либо нет. Мы добавим необязательный четвертый параметр к вызову процедуры DES3ENCRYPT, если необходимо использовать тройной ключ. Затем выполняем строку, пос1лая данные и ключ для шифрования, и получаем данные в зашифрованном виде. Обратите внимание, как к исходным данным подставляются результаты применения функций PADSTR или PADRAW. Шифруется закодированная строка, дополненная до соответствующей длины.

Теперь рассмотрим функции, выполняющие обратные действия:

function decryptString(p data in varchar2 ,

p key in varchar2 default NULL) return varchar2

l string long; begin

setkey(p key); execute immediate begin

dbms obfuscation toolkit.des g StringFunction decrypt (input string => :1, key string => :2, decrypted string => :3 g stringWhich ) ; end;

using IN p data, IN g charkey, IN OUT l string; return unpadstr(l string) ;

end;

function decryptRaw(p data in raw,

p key in raw default NULL) return raw

l string long raw; begin

setkey(p key); execute immediate begin

dbms obfuscation toolkit.des g RawFunction decrypt (input => :1, key => :2, decrypted data => :3 g rawWhich ) ; end;

using IN p data, IN hextoraw(g charkey), IN OUT l string; return unpadraw(l string);

end;

Функции DECRYPTSTRING и DECRYPTRAW работают аналогично представленным ранее функциям ENCRYPT. Единственное отличие в том, что они вызывают из пакета DBMS OBFUSCATION TOOLKIT процедуры DECRYPT вместо ENCRYPT и



1 ... 413 414 415 [ 416 ] 417 418 419 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика