sábado, 7 de junio de 2014

Oracle DB 11G - DBMS_CRYPTO: Encriptamiento y desencriptamiento de datos.

Antes de iniciar este tutorial, lo recomiendo para personas que tengan un conocimiento intermedio sobre PLSQL y a aquellos que les gusta investigar el porque de las cosas.




Introducción.
En esta ocasión aprenderemos a encriptar y desencriptar datos usando Oracle 11 G (en mi caso la versión XE).

Anteriormente se utilizaba el paquete DBMS_OBFUSCATION_TOOLKIT a partir de Oracle8i, que soporta encriptación DES y triple DES (Data Encription Standard), y con ciertas limitaciones (por ejemplo, los datos a encriptar han de ser un múltiplo de 8 bytes). 

En la actualidad se utiliza DBMS_CRYPTO. Soporta más formas de encriptación, como la AES (Advanced Encription Standard), que sustituye el anterior DES y no hay limitación con el número de carácteres.

Entre las características de DBMS_CRYPTO es que puede ser utilizado en un bloque PLSQL tal como un store procedure.

En la sintaxis, de la encriptación como de la desencripción se utilizan 4 parámetros:
src --> Indica datos de tipo RAW para desencriptar.
typ --> Tipo de cifrado.
key --> Llave de encriptación y desncriptación utilizada.
iv --> Es un vector opcional para bloque de cifrado. Por defecto se usa NULL.

Práctica.
Y esta es la parte divertida.

1. Crearé una tabla de parámetros, en donde almacenaré las llaves que usaré para la encriptación y desencriptación.

CREATE TABLE ADM.ADM_PARAMETER
(
  ID_PARAMETER    NUMBER(4)                     NOT NULL,
  PARAMETER_NAME  VARCHAR2(10 BYTE)             NOT NULL,
  PARAMETER       VARCHAR2(500 BYTE)            NOT NULL
)

2. La poblaré con una llave de encriptación (inventada):
Insert into ADM.ADM_PARAMETER
   (ID_PARAMETER, PARAMETER_NAME, PARAMETER)
 Values
   (1, 'KEY_CRYPT', 'a5b7c9d0a5b7c9d0a5b7c9d0a5b7c9d0a5b7c9d0a5b7c9d0a5b7c9d0a5b7c9d0');
COMMIT;

3. Paso muy importante, para Oracle 11 XE hay que habilitar permisos de EXECUTE sobre DBMS_CRYPTO, de lo contrario no correrá:
  • Entramos a la base como SYS as SYSDBA.
  • Ejecutamos el comando:
    • grant execute on dbms_crypto to PUBLIC;
Esto para poder ejecutarlo en cualquier USER, sino solamente agregamos el USER que queremos que tenga permiso.

Si esto no les sirve GOOGLE, en mi caso fue funcional.

4. Una vez tenemos permisos de ejecución, crearemos la lógica de encripción y desencripción. En mi caso particular cree un paquete al que le llame ADM_UTIL. Adjunto el código del paquete:


La parte log no la usaremos para este ejemplo (la función RECORD_LOG especificamente).

5. Ahora, bastará ejecutar el siguiente Bloque anónimo para probar su funcionalidad:

DECLARE
in_string VARCHAR2(200) := 'Texto Encriptado';
out_string VARCHAR2(200);
BEGIN
out_string := ADM.ADM_UTIL.encryptor(in_string);
DBMS_OUTPUT.PUT_LINE('Encrypted Text: ' || out_string);
out_string := ADM.ADM_UTIL.decryptor(out_string);
DBMS_OUTPUT.PUT_LINE('Decrypted Text: ' || out_string);
END;

Habiliten el DBMS_OUTPUT  de su administrador de base de datos para ver los resultados.

Hasta aquí con este tutorial, si hay preguntas en los comentarios.

No hay comentarios:

Publicar un comentario