sql >> Base de Datos >  >> RDS >> Oracle

Cómo cifrar datos en Oracle usando PL SQL

Una forma simple y segura de cifrar y descifrar datos en Oracle con el paquete DBMS_OBFUSCATION_TOOLKIT. DBMS_OBFUSCATION_TOOLKIT permite que una aplicación cifre datos utilizando el estándar de cifrado de datos (DES) o los algoritmos Triple DES. A continuación se muestra el ejemplo de la función empaquetada de la base de datos para cifrar datos en Oracle usando PL SQL.

El siguiente paquete de herramientas utiliza el paquete DBMS_OBFUSCATION_TOOLKIT para cifrar y descifrar datos.

Nota:debe modificar la clave definida en este paquete para tener su método de cifrado secreto personalizado. Los datos están cifrados por la clave y solo se pueden descifrar con esa clave. Más información...

Uso para cifrar datos en Oracle:

Select toolkit.encrypt('The test data 123.') From Dual;
Shows:
-----------
5C8ADD7B98919FC937A53AB986782EA9EE63D4ADDF7CA322

Para descifrar datos:

select Toolkit.decrypt('5C8ADD7B98919FC937A53AB986782EA9EE63D4ADDF7CA322') from dual;
Shows:
-----------
The test data 123.
Create Or Replace PACKAGE Toolkit As
  FUNCTION encrypt (p_text  In  VARCHAR2) RETURN RAW;
  FUNCTION decrypt (p_raw  In  RAW) RETURN VARCHAR2;
END Toolkit;
/
Create Or Replace PACKAGE BODY Toolkit As
  ---- the custom key for 
  g_key     RAW(32767)  := UTL_RAW.cast_to_raw('20130417');
  ---- the custom padding character
  g_pad_chr VARCHAR2(1) := '_';

  PROCEDURE padstring (p_text  In OUT  VARCHAR2);

  FUNCTION encrypt (p_text  In  VARCHAR2) RETURN RAW Is
    l_text       VARCHAR2(32767) := p_text;
    l_encrypted  RAW(32767);
  BEGIN
    padstring(l_text);
    DBMS_OBFUSCATION_TOOLKIT.desencrypt(input          => UTL_RAW.cast_to_raw(l_text),
                                        Key            => g_key,
                                        encrypted_data => l_encrypted);
    RETURN l_encrypted;
  END;

  FUNCTION decrypt (p_raw  In  RAW) RETURN VARCHAR2 Is
    l_decrypted  VARCHAR2(32767);
  BEGIN
    DBMS_OBFUSCATION_TOOLKIT.desdecrypt(input => p_raw,
                                        Key   => g_key,
                                        decrypted_data => l_decrypted);
                                        
    RETURN Rtrim(UTL_RAW.cast_to_varchar2(l_decrypted), g_pad_chr);
  END;

  PROCEDURE padstring (p_text  In OUT  VARCHAR2) Is
    l_units  NUMBER;
  BEGIN
    IF Length(p_text) Mod 8 > 0 Then
      l_units := Trunc(Length(p_text)/8) + 1;
      p_text  := Rpad(p_text, l_units * 8, g_pad_chr);
    END IF;
  END;

END Toolkit;
/