Está en la página 1de 2

Encriptado de Datos

Para Ocultar Información:

Para ocultar información, debemos: crear un objeto llamado wallet dentro de la base de datos, crear o modificar la tabla donde se
almacenara la columna que deseamos ocultar (declarándola como ECRYPT O SALT), nos aseguramos de que el archivo sqlnet.ora
dentro del servidor de la base de datos cuente con la línea que señala la localización del wallet.

Así, los pasos para lograrlo son:

1.- En el archivo sqlnet.ora, incluir la siguiente línea que señala la localización del wallet dentro del Servidor de la Base de
Datos: ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=/oraclemgr/admin/bd/wallet)))

2.- Conectarse vía sqlplus como "/ as sysdba" a la base de datos, para crear la llave de ocultamiento.

alter system set encryption key identified by "llave" ;

Si se revisa el directorio señalado en el paso 1, se podrá advertir la presencia del wallet.

-rw------- 1usuario grupo 909 Abr 23 16:23 archivowallet.

3.- Cuando la base de datos se cierra (se baja), el wallet se cierra, por lo que hay que abrirlo con:

alter system set wallet open identified by “llave" ;

Si por el contrario se desea cerrar el wallet, sin bajar la base de datos, lo logramos con:

alter system set wallet close;

4.- Para emplearlo, advierta el siguiente caso:

sqlplus usuario@db

create table alu_crypt


(expediente number(6),
matricula char(6) ENCRYPT NO SALT);

insert into alu_crypt


select expediente, matricula
from estudiante
where expediente <= 40000

n rows inserted

1 select *
2* from alu_crypt

from alu_crypt
*
ERROR at line 2:
ORA-28365: wallet is not open

El error es por el wallet cerrado, lo que se evita abriéndolo.

Para “Criptografiar” Información:

Para guardar información de forma oculta, podemos emplear un paquete de Oracle, llamado DBMS_CRYPTO, en versiones anteriores
a la 10g, se aplicaba un paquete denominado DBMS_OBFUSCATIO_TOOLKIT que si bien permite almacenar datos encriptados
como varchar2, tiene sin embargo el inconveniente de que no siempre puede obtenerse la información original, al existir la posibilidad
de pérdida de caracteres, según la nota: 270919.1 de Oracle.

A continuación se muestra el código de un bloque anónimo que ejemplifica el empleo de dbms_crypto, para criptografiar información.

-- crypt6.sql
-- Código para demostrar la utilidad de dbms_crypto
DECLARE
input_string VARCHAR2 (200) := 'Secret Message';
output_string VARCHAR2 (200);
encrypted_raw RAW (2000); -- stores encrypted binary text
decrypted_raw RAW (2000); -- stores decrypted binary text
num_key_bytes NUMBER := 256/8; -- key length 256 bits (32 bytes)
key_bytes_raw RAW (32); -- stores 256-bit encryption key
encryption_type PLS_INTEGER := -- total encryption type
DBMS_CRYPTO.ENCRYPT_AES256
+ DBMS_CRYPTO.CHAIN_CBC
+ DBMS_CRYPTO.PAD_PKCS5;
vrfc varchar2(10);
vdecryp raw(2000);

BEGIN
-- key_bytes_raw := DBMS_CRYPTO.RANDOMBYTES (num_key_bytes);
-- Si lo deseáramos, podríamos generar la llave de forma
-- aleatoria, en nuestro caso, líneas adelante se define.

-- Recuperamos un valor de la base de datos

select rfc
into vrfc
from ealucryp
where expediente =35859 ;

input_string:=vrfc ;
key_bytes_raw := UTL_I18N.STRING_TO_RAW('LLAVE123LLAVE123LLAVE123LLAVE123','AL32UTF8') ;
encrypted_raw := DBMS_CRYPTO.ENCRYPT
( src => UTL_I18N.STRING_TO_RAW (input_string, 'AL32UTF8'),
typ => encryption_type,
key => key_bytes_raw );

DBMS_OUTPUT.PUT_LINE ('String for Encrypted : ' || input_string);


DBMS_OUTPUT.PUT_LINE (' Encrypted string : ' || encrypted_raw);
DBMS_OUTPUT.PUT_LINE (' Key : ' || key_bytes_raw);
vdecryp:= DBMS_CRYPTO.DECRYPT
( src => encrypted_raw,
typ => encryption_type,
key => key_bytes_raw );
output_string := UTL_I18N.RAW_TO_CHAR (vdecryp, 'AL32UTF8');
DBMS_OUTPUT.PUT_LINE (' Decrypted string : ' || output_string);

END;
/

SQL> set serveroutput on

SQL> start c:\crypt6.sql

String for Encrypted : GABR690507


Encrypted string : D78327801B8333B204C3573DBF01116C
Key : 5541513230303839554151323030383955415132303038395541513230303839
Decrypted string : GABR690507

Podrá advertirse que se deberá guardar el resultado en tipo de dato raw (de requerirse), para evitar la pérdida de información. Debe
también, tener una llave que le permita encriptar los datos. Dicha llave no se está almacenando, por lo que se deberá implementar una
forma de “recordarla”. Para poder emplear la llave, debe convertirse a Hexadecimal con UTL_I18N.STRING_TO_RAW, del mismo
modo en que debe llevarse de raw a string, las cadenas criptografiadas con UTL_I18N. RAW_TO_STRING

El ejemplo no almacena los datos criptografiados, sólo los manipula en memoria

También podría gustarte