Está en la página 1de 3

QUICK

GUIDE
Gua

Como ocultar cdigo PL/SQL (Wrap)

Versin

001

Fecha

05/06/2013

Introduccin
Puede el cdigo PL/SQL ser escondido y protegido de miradas ajenas, cuando lo implantamos en
alguna base de datos externa?
La respuesta a esta inquietud es SI, gracias a un ejecutable y un paquete disponible que nos permite
compilar un procedimiento almacenado y hacer que el fuente quede confuso para quien intenta leerlo.
Oracle se refiere a este mtodo como ofuscamiento "obfuscation" (el trmino ofuscar en el diccionario
tiene el significado de "oscurecer, encubrir").
Es curioso como todava hay empresas que desarrollan software de altsimo valor corporativo y lo
implantan expuestamente en bases de datos de usuarios finales que en muchos casos tiene acceso la
propia competencia. No todos en la industria son mal intencionados, pero es mejor prevenir que
lamentar perder margen de ventaja.

Qu encriptar
Todo lo que sea cdigo almacenado: procedimientos, funciones, paquetes y tipos. La excepcin son los
triggers, el mtodo no los soporta, sin embargo una solucin es pasar la lgica a un procedimiento
encriptado y llamarlo desde el trigger.
Una recomendacin: usemos un criterio, no seamos paranoicos. Muy a menudo, parte de nuestro
cdigo tiene que ser compartido con otros proveedores, necesitamos tener disponibles ciertos objetos
para que otros puedan construir sus propios programas a partir de ellos. No necesitamos ofuscar todos
los paquetes de nuestra base de datos, solamente aquellos que tengan lgica de negocio sensible de la
compaa, como algoritmos, paquetes financieros, lgica de procesamiento, mantenimiento de cuentas,
paquetes de seguridad, etc.
Oracle no recomienda usar este mtodo para encriptar contraseas, ya que si abrimos el archivo
generado, podremos ver identificadores y reconocer algunas palabras que estn presentes en el cdigo
original.

Antes de comenzar
Es importante tener en cuenta que estaremos escondiendo el cdigo de miradas ajenas y hasta de la
nuestra, ya que una vez que el cdigo est encriptado en la base de datos, no hay forma ni usuario que
pueda recuperarlo. Para realizar modificaciones, hay que hacerlas sobre la versin de texto original. La

1 | P g i n a


recomendacin es usar un manejador de versiones como repositorio de cdigo, y luego adoptar la
prctica de encriptar antes de recompilar.

Cmo encriptar
Existe un ejecutable en $ORACLE_HOME/bin que se llama wrap. Llamndolo desde la consola, y
pasndole el nombre de un script en el parmetro iname, nos retorna un archivo de texto .plb con
cdigo interno, el cual podremos compilar en SQL*plus para crear el objeto almacenado "ofuscado".

Ejemplo 1
Vamos a encriptar un procedimiento. Para ello ya tenemos el cdigo del mismo en un archivo
ob_proc.sql, copiado en el servidor de la base de datos. Todo lo que tenemos que hacer es entrar en la
consola y ejecutar:
WRAP EDEBUG=WRAP_NEW_SQL INAME=OB_PROC.SQL

PL/SQL WRAPPER: RELEASE 9.2.0.8.0- PRODUCTION ON THU AUG 13


11:38:30 2009 COPYRIGHT (C) ORACLE CORPORATION 1993, 2001. ALL RIGHTS RESERVED.
PROCESSING OB_PROC.SQL TO OB_PROC.PLB

Nota: El flag edebug=wrap_new_sql es necesario para poder soportar el nuevo compilador de sql y
corregir un bug existente con algunas sintaxis de sql avanzado.
La salida, es el archivo encriptado ob_proc.plb, el cual ahora podemos compilar en SQL*plus.
SQL> @OB_PROC.PLB
PROCEDURE CREATED.

El cdigo del procedure en la base de datos no es ms legible, ya sea usando cualquier programa de
desarrollo, paquete Oracle o vista del diccionario. Sin embargo es perfectamente ejecutable como
cualquier otro procedimiento.

Ejemplo 2
Ahora encriptaremos un paquete. Se realiza en forma similar, recordando que el paquete se compone
por especificacin y opcionalmente un cuerpo. Si bien podemos encriptar ambos, se recomienda en la
mayoria de los casos encriptar nicamente el cuerpo. Despus de todo, es donde reside la lgica que
queremos proteger. La especificacin es til muchas veces para consultar la firma de las funciones que
estn siendo expuestas, y es amable disponibilizarlas para el uso comn.
Teniendo el cuerpo de nuestro paquete preparado en el archivo ob_pack_body.sql, ejecutamos:
WRAP EDEBUG=WRAP_NEW_SQL INAME=OB_PACK_BODY.SQL

PL/SQL WRAPPER: RELEASE 9.2.0.8.0- PRODUCTION ON THU AUG 13

2 | P g i n a


11:38:30 2009 COPYRIGHT (C) ORACLE CORPORATION 1993, 2001. ALL RIGHTS RESERVED.
PROCESSING OB_PACK_BODY.SQL TO OB_PACK_BODY.PLB

Si nuestro paquete ya estaba compilado en la base de datos, recordemos que nicamente necesitamos
recompilar el cuerpo. De lo contrario, tendremos que compilar la especificacin primero.
SQL> @OB_PACK_BODY.PLB
PACKAGE BODY CREATED.

El cdigo de especificacin del paquete, que ya estaba compilado, contina siendo visible, mientras que
el body ahora fue ocultado y no est ms disponible a la vista de todos.

Nota
Es importante tener permisos de escritura sobre la carpeta en la que se encuentre el fichero del
procedimiento que queramos ofuscar ya que el SQL * plus debe guardar en esa misma ruta el fichero de
salida generado.

3 | P g i n a

También podría gustarte