Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Ingeniería de Sistemas
DOCENTE:
Ing. Alvaro Mejia
DBMS_CRYPTO en Oracle 12 c:
DBMS_CRYPTO proporciona una interfaz para cifrar y descifrar datos almacenados, y se
puede usar junto con programas PL / SQL que ejecutan comunicaciones de red.
Proporciona soporte para varios algoritmos de cifrado y hash estándar de la industria,
incluido el algoritmo de encriptación Advanced Encryption Standard (AES). AES ha
sido aprobado por el Instituto Nacional de Estándares y Tecnología (NIST) para
reemplazar el Estándar de Encriptación de Datos (DES).
Salida:
User USR_P9 creado
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing
options
Grant succeeded.
Paso 6: Una vez que tenemos permisos de ejecución, crearemos la lógica de encriptación
y desencriptación. Conectados con el usuario “usr_p9” corremos los packages:
ADM_UTIL_spec.sql y ADM_UTIL_body.sql.
ADM_UTIL_spec.sql
FUNCTION decryptor
(
INPUT_STRING IN VARCHAR2
)
RETURN VARCHAR2;
END;
Salida:
ADM_UTIL_body.sql
BEGIN
SELECT parameter
INTO key_seed
FROM USR_P9.P9_PARAMETER
WHERE PARAMETER_NAME = 'KEY_CRYPT';
-- Convert incoming string and supplied seed to RAW datatype using the
-- new UTLI18N package to convert the string to the AL32UTF8 character
-- set
converted_string := UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8');
converted_seed := UTL_I18N.STRING_TO_RAW(key_seed, 'AL32UTF8');
-- Encrypt the RAW value using the ENCRYPT function and the appropriate
-- encryption type
encrypted_string :=
DBMS_CRYPTO.ENCRYPT(
src => converted_string
,typ => SH1_ECB_ZERO
,key => converted_seed
,iv => NULL);
RETURN encrypted_string;
EXCEPTION
WHEN OTHERS THEN
SQLERRMSG := SQLERRM;
SQLERRCDE := SQLCODE;
RETURN NULL;
END encryptor;
FUNCTION decryptor (
input_string IN VARCHAR2 )
RETURN VARCHAR2
IS
-- Local variables c
onverted_string VARCHAR2(64);
key_seed VARCHAR2(64) ;
converted_seed RAW(64);
decrypted_string VARCHAR2(64);
BEGIN
SELECT parameter
INTO key_seed
FROM USR_P9.P9_PARAMETER
WHERE PARAMETER_NAME =
'KEY_CRYPT';
-- Convert incoming string and supplied seed to RAW datatype using the
-- new UTLI18N package to convert the string to the AL32UTF8 character
-- set
converted_string := UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8');
converted_seed := UTL_I18N.STRING_TO_RAW(key_seed, 'AL32UTF8');
-- Encrypt the RAW value using the ENCRYPT function and the appropriate
-- encryption type
decrypted_string :=
DBMS_CRYPTO.DECRYPT(
src => input_string ,
typ => SH1_ECB_ZERO ,
key => converted_seed ,
iv => NULL);
-- Convert incoming string to RAW datatype, using the UTLI18N package
-- to convert the string to the AL32UTF8 character set
converted_string := UTL_I18N.RAW_TO_CHAR(decrypted_string, 'AL32UTF8'); RETURN
converted_string; EXCEPTION WHEN OTHERS THEN SQLERRMSG := SQLERRM; SQLERRCDE :=
SQLCODE; RETURN NULL; END decryptor; END;
Salida:
Primero se debe habilitar el paquete DBMS_OUTPUT para ver los resultados. Con el
comando: set serveroutput on
END toolkit;
-- --------------------------------------------------
FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW IS
-- --------------------------------------------------
l_text VARCHAR2(32767) := p_text;
l_encrypted RAW(32767);
BEGIN
padstring(l_text);
DBMS_OBFUSCATION_TOOLKIT.desencrypt(input =>
UTL_RAW.cast_to_raw(l_text),
key => g_key,
encrypted_data => l_encrypted);
RETURN l_encrypted;
END;
-- --------------------------------------------------
FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2 IS
-- --------------------------------------------------
l_decrypted VARCHAR2(32767);
BEGIN
DBMS_OBFUSCATION_TOOLKIT.desdecrypt(input => p_raw,
key => g_key,
decrypted_data => l_decrypted);
-- --------------------------------------------------
PROCEDURE padstring (p_text IN OUT VARCHAR2) IS
-- --------------------------------------------------
l_units NUMBER;
BEGIN
IF LENGTH(p_text) MOD 8 > 0 THEN
l_units := TRUNC(LENGTH(p_text)/8) + 1;
p_text := RPAD(p_text, l_units * 8, g_pad_chr);
END IF;
END;
-- --------------------------------------------------
END toolkit;
--FUNCIONAMIENTO
set serveroutput on
DECLARE
l_value VARCHAR2(16) := 'Daniel Amay';
l_raw RAW(16);
BEGIN
DBMS_OUTPUT.put_line('Texto: ' || l_value);
l_raw := toolkit.encrypt(l_value);
DBMS_OUTPUT.put_line('Texto_Encriptado: ' || l_raw);
DBMS_OUTPUT.put_line('Valor Original : ' || toolkit.decrypt(l_raw));
END;
Encriptación y Desencriptación en Postgres 10:
Salida:
CREATE EXTENSION
--insert
insert into public."personas" (per_id, per_nombre)
values (1, encrypt('Daniel Amay', 'llave', '3des')::text);
--SELECT NORMAL
SELECT * FROM personas
El algoritmo DES usa una clave simétrica de 64 bits, los primeros 56 son empleados
en cifrado, y los 8 restantes se usa para la comprobación de errores durante el
proceso.
--segunda forma
--insert
insert into public."personas" (per_id, per_nombre)
values (2, encrypt('Wilmer Camas', 'llave', 'des')::text);
--select normal
SELECT * FROM personas where per_id=2;
--insert
insert into public."personas" (per_id, per_nombre)
values (3, encrypt('Edison Huinaizaca', 'llave', 'bf')::text);
Crear la Tabla persona para probar los diferentes métodos para encriptar y
desencriptar datos.
nombre VARBINARY(100) ,
apellido VARBINARY(200) ,
SELECT id,
CAST(nombre AS
CHAR(50)) Nombre,
FROM Persona
where id=1;
Resultado:
SELECT id,
CAST(AES_DECRYPT(nombre, 'clave') AS
CHAR(50)) Nombre,
FROM Persona
where id=1;
Funcion decode: Esta función descripta la función decode la cual es una cadena de
texto
SELECT id,
CAST(nombre AS
CHAR(50)) nombre,
FROM Persona
WHERE id=2;
Resultado:
SELECT id,
CAST(decode(nombre, 'clave') AS
CHAR(50)) nombre,
FROM Persona
WHERE id=2;
Resultado:
Tercera Forma usando (des_encrypt):
Esta función encripta la cadena con la clave dada usando el algoritmo Triple-DES.
Para que de esta forma los datos puedan estar encriptados de una mejor manera.
SELECT id,
CAST(nombre AS
CHAR(50)) Nombre,
FROM Persona
where id=3;
#---select para desencriptar usando (des_encrypt)
SELECT id,
CAST(des_decrypt(nombre, 'clave') AS
CHAR(50)) Nombre,
FROM Persona
where id=3;
CONCLUSIONES
-Utilizar estos métodos de encriptación nos ayudan a proteger los datos de la base
de datos.
-Permite controlar el acceso a los usuarios mediante la encriptación.
-Para poder visualizar las funciones y procedimientos se debe ejecutar la linea :
set serveroutput
on;
Bibliografía:
mariiss15. (2012, nov 14). mariss15. Retrieved from mariis15:
https://mariiss15.wordpress.com/2012/11/14/algoritmos-de-encriptacion-simetrica-y-
asimetrica/
wilson, c. (2015). administarcion de base de datos con postgresSQL. In M. I. ing.
Mariuxi paola,
administarcion de base de datos con postgresSQL (p. 86). cuenca: UPS
(2017). Database PL/SQL Packages and Types Reference. 26/1/2018, de Oracle Sitio
web: https://docs.oracle.com/database/121/ARPLS/d_crypto.htm#ARPLS664
(2017). DBMS_OBFUSCATION_TOOLKIT. 26/1/2018, de Database PL/SQL Packages and Types
Reference Sitio web:
https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_obtool.htm#ARPLS028