Базы данных Oracle - статьи

         

Пакет DBMS_CRYPTO


В версии 10 в состав системных пакетов включен (в перспективе – на замену DBMS_OBFUSCATION_TOOLKIT) более функциональный пакет DBMS_CRYPTO, позволяющий шифровать данные других типов (не RAW и VARCHAR2, а RAW, CLOB и BLOB) и другими алгоритмами (не только DES, 3DES, но еще и AES, и RC4, и 3DES_2KEY плюс алгоритмы хеширования плюс параметризация этих алгоритмов). Он построен по иной технике, когда для шифрования используются всего две общие функции ENCRYPT и DECRYPT, а ссылка на конкретный алгоритм передается параметром. Вот как с помощью DBMS_CRYPTO может выглядеть DES-шифрование той же строки тем же ключом, что и выше:

DECLARE input_string VARCHAR2(255) := 'Morgen, morgen, nur nicht heute'; raw_input RAW(4000);

key_string VARCHAR2(8) := 'MagicKey'; raw_key RAW(16);

encrypted_raw RAW(4000); encrypted_string VARCHAR2(4000);

decrypted_raw RAW(4000); decrypted_string VARCHAR2(4000);

BEGIN DBMS_OUTPUT.PUT_LINE(input_string);

raw_input := UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8');

raw_key := UTL_RAW.CAST_TO_RAW(CONVERT(key_string, 'AL32UTF8'));

encrypted_raw := DBMS_CRYPTO.ENCRYPT ( TYP => DBMS_CRYPTO.DES_CBC_PKCS5 ,SRC => raw_input ,KEY => raw_key );

decrypted_raw := DBMS_CRYPTO.DECRYPT ( TYP => DBMS_CRYPTO.DES_CBC_PKCS5 ,SRC => encrypted_raw ,KEY => raw_key );

decrypted_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');

DBMS_OUTPUT.PUT_LINE(decrypted_string); END; /

(Чтобы пример проработал, нужно будет выполнить от имени SYS:

GRANT EXECUTE ON DBMS_CRYPTO TO PUBLIC;

Скорее всего разработчики забыли вставить это предложение в сценарий заведения пакета и в будущих выпусках СУБД этого нам делать не придется).

Здесь технология не требует искусственного удлиннения строки до нужной кратности, но зато необходимо предъявлять параметры в формате RAW и в кодировке AL32UTF8, что тоже приводит к усложнению текста.



Константа DBMS_CRYPTO.DES_CBC_PKCS5 выше есть сумма трех констант ENCRYPT_DES (алгоритм шифрования, размер ключа), CHAIN_CBC (размер блоков, на которые в процессе шифрования будет разбиваться исходная строка) и PAD_PKCS5 (схема дополнения строки до требуемой кратности). В этом легко удостовериться:


SQL> EXEC DBMS_OUTPUT.PUT_LINE(DBMS_CRYPTO.ENCRYPT_DES) 1

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_OUTPUT.PUT_LINE(DBMS_CRYPTO.CHAIN_CBC) 256

PL/SQL procedure successfully completed.

SQL> EXEC DBMS_OUTPUT.PUT_LINE(DBMS_CRYPTO.PAD_PKCS5) 4096

PL/SQL procedure successfully completed.

SQL> SELECT 1 + 256 + 4096 FROM DUAL;

1+256+4096 ---------- 4353

SQL> EXEC DBMS_OUTPUT.PUT_LINE(DBMS_CRYPTO.DES_CBC_PKCS5) 4353

PL/SQL procedure successfully completed.

Чтобы в точности воспроизвести пример с DBMS_OBFUSCATION_TOOLKIT выше, нужно будет дополнять шифруемую строку нулями, и тогда вместо

TYP => DBMS_CRYPTO.DES_CBC_PKCS5

указать

TYP => DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO

Упражнение Проверить, что алгоритм DES реализован в обоих пакетах идентично, зашифровав строку процедурой DESENCRYPT пакета DBMS_OBFUSCATION_TOOLKIT, а расшифровав функцией DECRYPT пакета DBMS_CRYPTO.

Тем не менее, современная технология не рекомендует на практике дополнять строку нулями, а советует пользоваться схемой дополнения PKCS5.

Пример указания алгоритма шифрования AES ключом в 128 разрядов:

TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5

Прочие возможности пакета DBMS_CRYPTO приведены в документации.


Содержание раздела