lunes, 1 de agosto de 2011

Encriptar Información Parte I (Base de datos)

Muchas veces por motivos de seguridad se nos hace necesario encriptar información. La gran pregunta es donde es más recomendable hacerlo (Aplicación, datos) y mi respuesta es clara “todo depende del proyecto(de claro nada jajaja) en post de ayudar les voy a dejar un tips para Oracle y otro en la segunda parte de este post en C#.

Encriptación de datos en la base de datos

Las ventajas de encriptar cadenas y campos dentro de la base de datos son las siguientes:

1.- Aumento del Nivel de seguridad externo de una solución, ya que hace necesario en la mayoría de los casos que el atacante deba tener un acceso considerable al servidor de base de datos para robar información.

2.- Aumento del Nivel de seguridad interno de una solución, esto se explica mucho mejor con un ejemplo: supongamos que tenemos una tabla Usuario en donde se almacena el rut y el password, si no tenemos encriptada la información ésta será accesible por todos los funcionarios (dba, desarrolladores) que tengan acceso al esquema.

Las desventajas:

1.- A más datos encriptados más lento y complejo será nuestro trabajo y el acceso a los datos, hay que encriptar sólo lo necesario.

2.- Si un proyecto no ésta bien diseñado en cuanto a niveles de seguridad, la encriptación solo será un maquillaje sin consistencia.

A continuación les dejo una función que encripta los datos y a su vez transforma la cadena encriptada a un Hexadecimal, esto último es solo si quieren ocupar esta cadena desde una aplicación Web.

CREATE OR REPLACE FUNCTION CINTEGRALC.encript(url varchar2)

RETURN varchar2 IS

hexvalue varchar2(5000);

enc_key RAW(8) := UTL_RAW.cast_to_raw('EDC34rfv');

l_enc_val varchar2 (2000);

l_enc_val_raw raw(2000);

l_mod number := DBMS_CRYPTO.ENCRYPT_DES

+DBMS_CRYPTO.CHAIN_ECB

+DBMS_CRYPTO.PAD_PKCS5;

BEGIN

l_enc_val_raw := dbms_crypto.encrypt

(

UTL_I18N.STRING_TO_RAW(url,'WE8ISO8859P1'),

l_mod,

enc_key

);

l_enc_val:= UTL_I18N.RAW_TO_CHAR(l_enc_val_raw,'WE8ISO8859P1');

for i in 1..length(l_enc_val) loop

hexvalue := hexvalue||hextoraw(to_char(ascii(substr(l_enc_val, i, 1)), 'FMXX'));

end loop;

RETURN hexvalue;

END encript;

Dentro de ésta función la que realmente hace la magia es DBMC_CRYPTO.ENCRYPT en este caso me pide tres parámetros:

1.- UTL_I18N.STRING_TO_RAW(url,'WE8ISO8859P1'), -> cadena a encriptar mas el tipo de globalización de Oracle.

2.- l_mod -> este es el tipo de cifrado, en este caso le solicitamos que opere con un cifrado en bloque de 3

3.- enc_key -> por último la clave con la que se está encriptando les recomiendo útilizar una clave con la misma estructura que se define en el ejemplo

En Sql server 2005 y 2008 es con la siguiente función encryptbypassphrase es tan sencillo que no necesita ejemplo