martes, 19 de febrero de 2008

Encriptar el código plsql

Encriptar el código plsql de procedimientos y funciones

La seguridad es uno de los aspectos más importantes a destacar en el desarrollo de aplicaciones. La posibilidad de dar a conocer la estructura interna de las aplicaciones es una “puerta” que en lo posible debe permanecer cerrada si queremos evitar que intrusos malintencionados puedan hacer daño al interior del sistema.

Una de las formas de mejorar la seguridad al interior de las aplicaciones es encriptar el código de los procedimientos y funciones almacenadas, a fin de que el código original no sea visible

Usando la utilidad WRAP, podemos esconder el código de los procedimientos, funciones y paquetes, a fin de evitar operaciones de ingeniería en reversa o copia del código, principalmente cuando un procedimiento o función hacen algún calculo, operación especial que no deseamos sea conocido por los demás. Por lo anterior, esta utilidad puede utilizarse para encriptar el código de las siguientes sentencias:

CREATE [OR REPLACE] FUNCTION nombre_de_la_funcion
CREATE [OR REPLACE] PROCEDURE nombre_del_procedimiento
CREATE [OR REPLACE] PACKAGE nombre_del_paquete
CREATE [OR REPLACE] PACKAGE BODY nombre_del_paquete
CREATE [OR REPLACE] TYPE nombre_del_tipo ... OBJECT
CREATE [OR REPLACE] TYPE BODY nombre_del_tipo

Es importante tener claro que los nombres de variables, nombres de tablas y literales, no son encriptados; estos quedan igual en el código encriptado. Por lo anterior, no se recomienda usar esta utilidad como medio para encriptar claves o nombres de usuarios.

Veamos un breve ejemplo:

Creamos un archivo de texto, donde se encuentra el código plsql para crear una función que calcula la función matemática potencia. Para el ejemplo vamos a llamar a este archivo ejemplo.sql

Ejemplo.sql

CREATE or REPLACE FUNCTION potencia (base in number, exponente in number)RETURN NUMBER IS
c number:=1;
BEGIN
for i in 1..exponente loop
c := c * base;
end loop;
return c;
END;

Una vez se ha creado el archivo, procedemos a ejecutar en la linea de comandos del sistema operativo:

ORACLE_HOME\bin\wrap iname=ejemplo.sql oname=ejemplo.enc

iname: nombre del archivo de entrada
oname: nombre del archivo de salida
(ORACLE_HOME: directorio de instalación de oracle ejem: E:\oracle\product\10.1.0\Db_2\ )

E:\oracle\product\10.1.0\Db_2\BIN>wrap iname=ejemplo.sql oname=ejemplo.enc
PL/SQL Wrapper: Release 10.1.0.2.0- Production on Mar Ene 25 15:38:31 2005
Copyright (c) 1993, 2004, Oracle. All rights reserved.
Processing ejemplo.sql to ejemplo.enc

Si editáramos el archivo generado ejemplo.enc, tendríamos el siguiente bloque de código:

CREATE or REPLACE FUNCTION potencia wrapped
a000000
b2
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
af c6
A6tVTuslOz2oYSH+nFVJI4EvyPUwgy7wNZ5qfHQ2EvAPawu68sqx43bgXD6sK2VKsnO1DGYH
iTn1MYgrmMNjZujI2EvxR7jwTpfKnqMk904dzhNZk9m9GWWc7Kq9kbKm9RpSq3yiP/RA/wjg
ubrHffi1sMSTwDHzX7d4u1Bgs70ex5y0RT/GLzi41pyyKMM+Xg==

/

Una vez generado el archivo con el código de nuestra función encriptado, procedemos a la función.

Solamente basta con ingresar al sqlplus e ingresar el comando

SQL> @directorio_donde_se_encuentra_el_archivo\ejemplo.enc
Function created.

Qué pasa si se quiere modificar el código del procedimiento?

Ya que el código original se encuentra en los archivos originales(valga la redundancia) y que el código de la función almacenada no se puede desencriptar, es indispensable tener un servidor de archivos, o un mecanismo que sirva como repositorio para los archivos, al cual se pueda recurrir para buscar el texto original, modificarlo, encriptarlo y ejecutarlo nuevamente.

Listo, eso es todo.