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.

Nessun commento:

Posta un commento