19 feb 2009

PL/SQL Usar MD5 en un trigger

Hola!!

Estamos desarrollando una nueva solucion de intranet, y necesitabamos almacenar las contraseñas de usuarios en un entorno "Relativamente" seguro. Por lo que se decidio dejarlas en la BDD con MD5 y realizar la validacion cada vez que el usuario envia la contraseña.

Para optimizar el proceso, todos los usuarios tendrian de clave inicial una palabra comun y ellos en su primer acceso tendrian que actualizarla.

Para que este proceso se llevara a cabo a nivel de base de datos y no de WEB se utilizaria la funcion DBMS_OBFUSCATION_TOOLKIT.MD5. Sin embargo truco para usar esta funcion es que hay que forzar el descriptor del parametro, de lo contrario Oracle envia el mensaje:

PLS-00307: too many declarations of 'MD5' match this call

Esto se debe a que hay dos declaraciones de la misma funcion con el tipo de ingreso.
1. DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT: RAW)
2. DBMS_OBFUSCATION_TOOLKIT.MD5(INPUT_STRING: VARCHAR2)

SOLUCION: Forzar el tipo de parametro que recibira la funcion.
DBMS_OBFUSCATION_TOOLKIT.MD5(input_string=>'usuario');

Aca les dejo todo el trigger por si les sirve de referencia:

create or replace trigger "TABLA1_BI"
BEFORE insert on "TABLA1" for each row
declare
raw_data VARCHAR2(100);
texto_cifrado VARCHAR2(100);
begin
--Convierte la cadena DOSPINOS a MD5
raw_data :=
DBMS_OBFUSCATION_TOOLKIT.MD5(input_string=>'usuario');
--Convierte el MD5
crudo a datos legibles
select lower(rawtohex(raw_data)) into texto_cifrado
from dual;
--Asigna al nuevo campo el dato en MD5 legible
:new.password
:= texto_cifrado;
--imprime el debug para ver que devuelve la funcion
--DBMS_OUTPUT.put_line('texto_cifrado 'texto_cifrado);
end;

Las fuentes que use de ejemplo estan Aqui y Aqui