giovedì 21 aprile 2022

RDBMS - Funzioni per criptare e decriptare una stringa

Di seguito un paio di funzioni per criptare e decriptare un testo.

Gli algoritmi utilizzati sono : 

A =DES3_CBC_PKCS5  D =ENCRYPT_AES256 +CHAIN_CBC +PAD_PKCS5;

Di seguito le funzioni:

--------------------------------------------------------------------------------

--- funzione per cifrare un testo

--- ALGORITMO = 

---    A =DES3_CBC_PKCS5

---    D =ENCRYPT_AES256 +CHAIN_CBC +PAD_PKCS5;

--- ES: select pkg_gest_plsql_odi.cifra('Questo è un testo molto lungo da cifrare, contiene anche ritorni a capo etc...',  'MIACHIAVE012345678901234','D') cifrato  from dual;

---------------------------------------------------------------------------------

 function CIFRA(in_str in VARCHAR2, 

                                 chiave in varchar2, 

                                 Algoritmo in char) 

                  return RAW is

 raw_da_cifrare RAW(2048) :=  UTL_RAW.CAST_TO_RAW(CONVERT(in_str,'AL32UTF8','WE8MSWIN1252'));

 raw_chiave     RAW(128) := UTL_RAW.CAST_TO_RAW(CONVERT(chiave,'AL32UTF8','WE8MSWIN1252'));

 alg           PLS_INTEGER;

 v_err varchar2(4000):=null; 

BEGIN

 if Algoritmo = 'D' then

    alg := sys.DBMS_CRYPTO.DES3_CBC_PKCS5;

 elsif Algoritmo = 'A' then

    alg := sys.DBMS_CRYPTO.ENCRYPT_AES256 + 

           sys.DBMS_CRYPTO.CHAIN_CBC + 

           sys.DBMS_CRYPTO.PAD_PKCS5;

 else    RAISE_APPLICATION_ERROR(-20001,'Algoritmo non previsto, scegliere D o A!');

 end if;

 return dbms_crypto.Encrypt(raw_da_cifrare, alg, raw_chiave);

EXCEPTION

      WHEN OTHERS THEN

        V_ERR:='Errore => '||SQLERRM;

         RAISE_APPLICATION_ERROR(-20002,V_ERR); 

END CIFRA;

--------------------------------------------------------------------------------

--- funzione per decifrare un testo

--- ALGORITMO = 

---    A =DES3_CBC_PKCS5

---    D =ENCRYPT_AES256 +CHAIN_CBC +PAD_PKCS5;

-- ES:   select pkg_gest_plsql_odi.decifra('DC84F4C1CA98FC27208C3A5013F0A88720DCCE5E5C1E250ADD38352404F3CB73E6C4A97DE64E999997B43F5531EAE824D6A2EA7AC5EE78BF5DBC3CCB86CC131B89CBADD7295D71DBE57B7CDC1DFE3787',     'MIACHIAVE012345678901234','D')   from dual;

 function DECIFRA(in_raw in RAW, chiave in varchar2, Algoritmo in char) 

                  return VARCHAR2 is

 raw_chiave     RAW(128) :=   UTL_RAW.CAST_TO_RAW(CONVERT(chiave,'AL32UTF8','WE8MSWIN1252'));

 raw_decifrata  RAW(2048);

 alg            PLS_INTEGER;

 v_err varchar2(4000):=null; 

BEGIN

 if Algoritmo = 'D' then

    alg := DBMS_CRYPTO.DES3_CBC_PKCS5;

 elsif Algoritmo = 'A' then

    alg := DBMS_CRYPTO.ENCRYPT_AES256 + 

           DBMS_CRYPTO.CHAIN_CBC + 

           DBMS_CRYPTO.PAD_PKCS5;

 else

    RAISE_APPLICATION_ERROR(-20001,

                 'Algoritmo non previsto, scegliere D o A!');

 end if;


 raw_decifrata := dbms_crypto.Decrypt(hextoraw(in_raw), alg, raw_chiave);

 return CONVERT(UTL_RAW.CAST_TO_VARCHAR2(raw_decifrata),'WE8MSWIN1252','AL32UTF8');

EXCEPTION


      WHEN OTHERS THEN

         V_ERR:='Errore => '||SQLERRM;

         RAISE_APPLICATION_ERROR(-20002,V_ERR); 

END DECIFRA;

--------------------------------------------------------------------------------

Occorrono per funzionare logicamente le grant sul package DBMS_CRYPTO di sys.

lunedì 11 aprile 2022

RDBMS ORACLE 19c - Increasing the Maximum Size of VARCHAR2, NVARCHAR2, and RAW Columns in a PDB

Sulle nuove versioni del DB Oracle è possibile portare le dimensioni di alcuni Datatypes al limite massimo consentito, ad esempio le Tabelle possono avere i campi di tipo VARCHAR2 non più come limite massimo 4000 ma ad esempio 32k.

Per poter effettuare questa modifica però occorre settare il seguente parametro:

  • MAX_STRING_SIZE = EXTENDED

Di seguito viene indicato come attivare questo incremento di Maximun Size all'interno di un Pluggable DB.

Per incrementare la dimensione massima di una colonna con Datatype VARCHAR2, NVARCHAR2 o un RAW in un Pluggable DB effettuare i seguenti passi:

  1. Shut down the PDB.
  2. Reopen the PDB in migrate mode.

Note:

The following SQL statement can be used to reopen a PDB in migrate mode when the current container is the PDB:

ALTER PLUGGABLE DATABASE pdb-name OPEN UPGRADE;

  1. Change the setting of MAX_STRING_SIZE in the PDB to EXTENDED.
  2. Run the rdbms/admin/utl32k.sql script in the PDB. You must be connected AS SYSDBA to run the utl32k.sql script.
  3. Reopen the PDB in NORMAL mode.

Note:

The utl32k.sql script increases the maximum size of the VARCHAR2NVARCHAR2, and RAW columns for the views where this is required. The script does not increase the maximum size of the VARCHAR2NVARCHAR2, and RAW columns in some views because of the way the SQL for those views is written.

  1. Run the rdbms/admin/utlrp.sql script in the PDB to recompile invalid objects. You must be connected AS SYSDBA to run the script.

Di seguito alcuni riferimenti:

  • Oracle Multitenant Administrator's Guide for more information about modifying the open mode of PDBs.
  • Increasing the Maximum Size of VARCHAR2, NVARCHAR2, and RAW Columns in a PDB
    • https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/MAX_STRING_SIZE.html#GUID-D424D23B-0933-425F-BC69-9C0E6724693C
  • Database Reference
    • https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/MAX_STRING_SIZE.html#GUID-D424D23B-0933-425F-BC69-9C0E6724693C