Supongamos que por políticas de nuestra empresa, necesitamos encryptar ciertas columnas cuando pasamos un respaldo a un ambiente de desarrollo.
Una manera muy sencilla de llevar a cabo esta tarea es mediante dbms_obfuscation_toolkit.
Primero creamos estas dos funciones, en un esquema diferente al cual vamos a encriptarlos datos y que no tenga acceso cualquier usuario.
create or replace function SYS.cryptf( p_str in varchar2 ) return varchar2
as
l_data varchar2(255);
begin
l_data := rpad( p_str, (trunc(length(p_str)/8)+1)*8, chr(0) );
dbms_obfuscation_toolkit.DESEncrypt
( input_string => l_data,
key_string => 'DBAKey03',
encrypted_string=> l_data );
return l_data;
end;
/
create or replace
function SYS.decryptf( p_str in varchar2 ) return varchar2
as
l_data varchar2(255);
begin
dbms_obfuscation_toolkit.DESDecrypt
( input_string => p_str,
key_string => 'DBAKey03',
decrypted_string=> l_data );
return rtrim( l_data, chr(0) );
end;
/
Ahora vamos a probarlo con el siguiente ejemplo.
create table t1 (c1 int, c2 varchar2(20));
insert into t1 values (1,'A');
insert into t1 values (1,'AA');
insert into t1 values (1,'AAA');
insert into t1 values (1,'AAAA');
commit;
select * from t1;
C1 C2
---------------------- --------------------
1 A
2 AA
3 AAA
4 AAAA
Actualizamos la información con la función sys.cryptf
update t1
set c2 = sys.cryptf(c2);
commit;
4 filas actualizadas.
confirmadas.
En este momento ya tenemos encriptada la columna seleccionada.
select * from t1;
C1 C2
---------------------- --------------------
1 6 f^ �
2 ��݂I�
3 ������
4 j��
Si queremos desencriptar solo utilizamos la función sys.decryptf
update t1
set c2 = sys.decryptf(c2);
commit;
4 filas actualizadas.
confirmadas.
select * from t1;
C1 C2
---------------------- --------------------
1 A
2 AA
3 AAA
4 AAAA
Incluso podríamos desenriptar un registro.
update t1
set c2 = herlinma.decryptf(c2)
where c1 = 2;