oracle-databaseoracle21c

How to replace dbms_obfuscation_toolkit with dbms_crypto


After being deprecated for quite some time, Oracle now removed the dbms_obfuscation_toolkit in 21c. What are the direct replacements for the following functions?


Solution

  • You would use one of the DBMS_CRYPT.ENCRYPT functions or procedures (see documentation) with an encryption_type of DBMS_CRYPTO.ENCRYPT_DES, plus whatever block cipher suites and modifiers you need.

    Example:

    DECLARE
       input_string       VARCHAR2 (200) :=  'Secret Message';
       output_string      VARCHAR2 (200);
       encrypted_raw      RAW (2000);             -- stores encrypted binary text
       decrypted_raw      RAW (2000);             -- stores decrypted binary text
       num_key_bytes      NUMBER := 256/8;        -- key length 256 bits (32 bytes)
       key_bytes_raw      RAW (32);               -- stores 256-bit encryption key
       encryption_type    PLS_INTEGER :=          -- total encryption type
    
                                     DBMS_CRYPTO.ENCRYPT_DES
                                     + DBMS_CRYPTO.CHAIN_CBC
                                     + DBMS_CRYPTO.PAD_NONE;
    
       iv_raw             RAW (16);
    
    BEGIN
       DBMS_OUTPUT.PUT_LINE ( 'Original string: ' || input_string);
       key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
       iv_raw        := DBMS_CRYPTO.RANDOMBYTES (16);
       encrypted_raw := DBMS_CRYPTO.ENCRYPT
          (
             src => UTL_I18N.STRING_TO_RAW (input_string,  'AL32UTF8'),
             typ => encryption_type,
             key => key_bytes_raw,
             iv  => iv_raw
          );
    
        -- The encrypted value "encrypted_raw" can be used here
    
        decrypted_raw := DBMS_CRYPTO.DECRYPT
          (
             src => encrypted_raw,
             typ => encryption_type,
             key => key_bytes_raw,
             iv  => iv_raw
          );
    
       output_string := UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
    
       DBMS_OUTPUT.PUT_LINE ('Decrypted string: ' || output_string); 
    END;