Encriptar datos en la base de datos

Respuesta de
a
Usuario
Hola, soy nuevo en Oracle. Tengo un proyecto en el que tengo que guardar cierta informacion en la base de datos de forma encriptada. Por documentacion he pensado en utilizar el paquete de Oracle DBMS_OFUSCATION_TOOLKIT. El problema es que no estoy seguro de como gestionar la clave de encriptacion ¿podrias aconsejarme como hacerlo? Muchas gracias por adelantado
Experto
Amigo.

Antes que nada disculpa la demora, no te imaginas lo cargado de estos meses.

respondiendo a tu pregunta (si es que todavia puedo serte de utilidad),

DBMS_OBFUSCATION_TOOLKIT provee de algoritmos de encryptacion basados en estandares.

Estas rutinas estan perfectamente documentadas en:

http://download-west.oracle.com/docs/cd/B14117_01/appdev.101/b10802/d_obtool.htm#1002213

Aqui un ejemplo de como utilizarlo:

-- encrypt.sql
-- demonstrates the use of the dbms_obfuscation_toolkit by
-- prompting a user for a password and encrypting and decrypting
-- the data

set serveroutput on;
CLEAR BUFFER
PROMPT Please enter a password - Must be 8 characters !
PROMPT
ACCEPT PASSWD

DECLARE
input_string VARCHAR2(16) := '&PASSWD';
raw_input RAW(128) := UTL_RAW.CAST_TO_RAW(input_string);
key_string VARCHAR2(16) := 'keepthesecretnum';
raw_key RAW(128) := UTL_RAW.CAST_TO_RAW(key_string);
encrypted_raw RAW(2048);
encrypted_string VARCHAR2(2048);
decrypted_raw RAW(2048);
decrypted_string VARCHAR2(2048);
error_in_input_buffer_length EXCEPTION;
PRAGMA EXCEPTION_INIT(error_in_input_buffer_length, -28232);
INPUT_BUFFER_LENGTH_ERR_MSG VARCHAR2(100) :=
'*** DES INPUT BUFFER NOT A MULTIPLE OF 8 BYTES - IGNORING EXCEPTION ***';
double_encrypt_not_permitted EXCEPTION;
PRAGMA EXCEPTION_INIT(double_encrypt_not_permitted, -28233);
DOUBLE_ENCRYPTION_ERR_MSG VARCHAR2(100) :=
'*** CANNOT DOUBLE ENCRYPT DATA - IGNORING EXCEPTION ***';

-- 1. Begin testing raw data encryption and decryption
BEGIN
dbms_output.put_line('> ========= BEGIN TEST RAW DATA =========');
dbms_output.put_line('> Raw input : ' ||
UTL_RAW.CAST_TO_VARCHAR2(raw_input));
BEGIN
dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,
key => raw_key, encrypted_data => encrypted_raw );
dbms_output.put_line('> encrypted hex value : ' ||
rawtohex(encrypted_raw));
dbms_obfuscation_toolkit.DESDecrypt(input => encrypted_raw,
key => raw_key, decrypted_data => decrypted_raw);
dbms_output.put_line('> Decrypted raw output : ' ||
UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw));
dbms_output.put_line('> ');
if UTL_RAW.CAST_TO_VARCHAR2(raw_input) =
UTL_RAW.CAST_TO_VARCHAR2(decrypted_raw) THEN
dbms_output.put_line('> Raw DES Encyption and Decryption successful');
END if;
EXCEPTION
WHEN error_in_input_buffer_length THEN
dbms_output.put_line('> ' || INPUT_BUFFER_LENGTH_ERR_MSG);
END;
dbms_output.put_line('> ');
END;
/

LA SALIDA DE ESTE EJEMPLO DEBE SER:

SQL> start encrypt
Please enter a password - Must be 8 characters !

wildwind
old 2: input_string VARCHAR2(16) := '&PASSWD';
new 2: input_string VARCHAR2(16) := 'wildwind';
> ========= BEGIN TEST RAW DATA =========
> Raw input : wildwind
> encrypted hex value : 28EAA8E9E2CEA710
> Decrypted raw output : wildwind
>
> Raw DES Encyption and Decryption successful
>

PL/SQL procedure successfully completed.
Usuario
Perdona, creo que no me he explicado con claridad. Mi pregunta era que de alguna forma tengo que gestionar la clave, es decir, en el ejemplo que me has mandado utilizas como clave de encriptación 'keepthesecretnum', ¿donde guardo dicha clave? Muchas gracias
Experto
Mira, puedes encryptar finalmente ese procedure.

Utiliza la utilidad wrap, esto se instala con las herramientas cliente de Oracle, primero generar un archivo que tenga el script del package, procedure o function, luego ejecutar el wrap con la sintaxis wrap iname=(ruta y nombre del archivo) oname=(ruta y nombre del archivo generado), el nuevo archivo se genera cuando le ingresas el oname, el script generado es el script de creacion encriptado, es necesario que se tenga una sola fuente porque una vez encriptado no se puede desencriptar.

Saludos

Diego.
Usuario
perdon por el retraso, me vino muy bien. Muchas gracias