Cifrado de datos con un procedimiento almacenado en Firebird

Un cliente me pidió que cifrara unos datos para que no pudieran ser vistos sin una contraseña. No requería de grandes cifrados, sino algo para que no fueran descubiertos los datos a primera vista.

Lo solucioné con un procedimiento almacenado que aplica la clásica función de cambiar los caracteres basándose en su código de cada carácter.


A continuación está el procedimiento:




CREATE PROCEDURE CODIFICAR(

FUNCION VARCHAR(1) CHARACTER SET NONE,

DATOIN VARCHAR(200) CHARACTER SET NONE)

RETURNS(

DATOOUT VARCHAR(200) CHARACTER SET NONE)

AS

DECLARE VARIABLE I INTEGER;

DECLARE VARIABLE C VARCHAR(1);

DECLARE VARIABLE MULT INTEGER;

BEGIN

DATOOUT = '';

IF (UPPER(:FUNCION)='E') THEN

MULT = 1;

ELSE MULT = -1;
I = 1;

WHILE (I<=CHAR_LENGTH(:DATOIN)) DO BEGIN

C = SUBSTRING(:DATOIN FROM :I FOR 1);

DATOOUT = :DATOOUT||ASCII_CHAR(ASCII_VAL(:C) + (34*:MULT));

I = :I + 1;

ENDSUSPEND;

END



Recibe como parámetro FUNCIÓN el cual si tiene el valor “E”, entonces codifica o cifra los datos, en caso contrario decodifica los datos.

DATOIN y DATOOUT son las variables donde recibe y regresa los datos respectivamente. En este caso son VARCHAR de 200, pero puede cambiarse a cualquier otro tamaño.

El número 34 en la línea:




DATOOUT = :DATOOUT||ASCII_CHAR(ASCII_VAL(:C) + (34*:MULT));

Es el offset que determina cuántos valores ASCII cambiarán para regresar cada carácter.

Su uso es muy sencillo, aunque lo tuve que utilizar dentro de otro procedimiento para que me regresara los datos de una tabla de manera codificada.

Lo probé así:




SELECT * FROM E('E','ABC')

Y el resultado fue: ‘cde’.