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

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


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

используют функцию UNPAD для декодирования полученной строки или данных типа

RAW.

Перейдем к функциям для шифрования больших объектов:

function encryptLob(p data in clob,

p key in varchar2) return clob

l clob clob;

l offset number default 1;

l len number default dbms lob.getlength(p data); begin

setkey(p key);

dbms lob.createtemporary (l clob, TRUE) ;

while (l offset <= l len)

loop

wa(l clob, encryptString(

dbms lob.substr(p data, g chunkSize, l offset)));

l offset := l offset + g chunksize; end loop; return l clob;

end;

function encryptLob(p data in blob,

p key in raw) return blob

l blob blob;

l offset number default 1;

l len number default dbms lob.getlength(p data); begin

setkey(p key);

dbms lob.createtemporary(l blob, TRUE);

while (l offset <= l len) loop

wa(l blob, encryptRaw(

dbms lob.substr(p data, g chunkSize, l offset)));

l offset := l offset + g chunksize; end loop; return l blob;

end;

Это перегруженные функции для данных типа BLOB и CLOB. Вначале они создают временный большой объект, в который будут записываться зашифрованные данные. Поскольку при шифровании мы изменяем длину строки/данных типа RAW, обеспечивая сохранение исходной длины и дополнение до необходимой, делать это на месте , используя существующий большой объект, не представляется возможным. Например, при наличии большого объекта размером 64 Кбайт мы увеличим первые 32 Кбайт. Теперь необходимо сместить остальные 32 Кбайта большого объекта, чтобы обеспечить пространство для записи увеличенного фрагмента данных. Кроме того, это не позволит вызывать данные функции из SQL-операторов, поскольку локатор большого объекта придется передавать в режиме IN/OUT, а при наличии параметров в режиме IN/OUT



Пакет DBMS OBFUSCATION TOOLKIT 1675

вызывать функцию в SQL-операторах нельзя. Поэтому мы просто копируем зашифрованные данные в новый большой объект, который затем можно использовать где угодно, в том числе в операторе INSERT или UPDATE.

Для шифрования и кодирования данных большого объекта используется следующий алгоритм. Начиная с байта 1 (L OFFSET), мы шифруем G CHUNKSIZE байт данных. Они добавляются к ранее созданному временному большому объекту. Добавляем к смещению значение G CHUNKSIZE и продолжаем выполнять тело цикла, пока не обработаем весь большой объект. Возвращаем временный большой объект вызывающему.

Теперь перейдем к дешифрованию данных больших объектов:

function decryptLob(p data in clob,

p key in varchar2 default NULL) return clob

l clob clob;

l offset number default 1;

l len number default dbms lob.getlength(p data);

begin

setkey(p key);

dbms lob.createtemporary(l clob, TRUE) ; loop

exit when l offset > l len;

wa(l clob, decryptString(

dbms lob.substr(p data, g chunksize+8, l offset)));

l offset := l offset + 8 + g chunksize; end loop; return l clob;

end;

function decryptLob(p data in blob,

p key in raw default NULL) return blob

l blob blob;

l offset number default 1;

l len number default dbms lob.getlength(p data);

begin

setkey(p key);

dbms lob.createtemporary(l blob, TRUE) ; loop

exit when l offset > l len; wa(l blob,decryptRaw(

dbms lob.substr(p data, g chunksize+8, l offset))) ;

l offset := l offset + 8 + g chunksize; end loop; return l blob;

end;

В этих функциях мы снова, по тем же причинам, что и ранее, используем временный большой объект для дешифрования. На этот раз, однако, есть еще одна причина для использования временного большого объекта. Если не использовать временный большой объект для записи дешифрованных данных, данные будут дешифроваться непосредственно в базе. Последующие операторы SELECT будут выдавать уже дешифро-



1676

Приложение А

ванные данные, если мы не скопируем их в новый большой объект. В данном случае использовать временный большой объект еще важнее.

Проходим в цикле по фрагментам большого объекта. Начав со смещения 1 (с первого байта) большого объекта, выбираем с помощью SUBSTR из него G CHUNKSIZE+8 байт. Эти 8 байт добавлены к данным функциями PADSTR/PADRAW при кодировании. Итак, обрабатываем большой объект фрагментами размером G CHUNKSIZE+8 байт, дешифруем данные и добавляем их к временному большому объекту. Этот объект затем возвращается клиенту.

Теперь рассмотрим последнюю часть пакета CRYPT PKG - интерфейс к подпрограммам, реализующим алгоритм MD5:

function md5str(p data in varchar2) return checksum str is

l checksum str checksum str; begin

execute immediate

begin :x := dbms obfuscation toolkit.md5(input string => :y); end; using OUT l checksum str, IN p data; return l checksum str;

end;

function md5raw(p data in raw) return checksum raw is

l checksum raw checksum raw; begin

execute immediate

begin :x := dbms obfuscation toolkit.md5(input => :y) ; end; using OUT l checksum raw, IN p data; return l checksum raw;

end;

function md51ob(p data in clob) return checksum str is

l checksum str checksum str; begin

execute immediate

begin :x := dbms obfuscation toolkit.md5(input string => :y) ; end; using OUT l checksum str, IN dbms lob.substr(p data,g chunksize,l); return l checksum str;

end;

function md51ob(p data in blob) return checksum raw is

l checksum raw checksum raw; begin

execute immediate

begin :x := dbms obfuscation toolkit.md5(input => :y) ; end; using OUT l checksum raw, IN dbms lob.substr(p data,g chunksize,l);

return l checksum raw;

end;

end;



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

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