Ocultar / ofuscar código PL/SQL (WRAP)

En ocasiones es necesario ocultar (ofuscar) nuestro código fuente PL/SQL. Esta utilidad debe de usarse con criterio, no se trata de ocultar todo el código disponible, sino únicamente aquel que por motivos de seguridad, no debe de ser compartido con terceros.
El método utilizado ha sido realizado tradicionalmente con la herramienta WRAP, la cual detallamos en este artículo y a partir de la versión 10g R2, es posible realizar esta acción con el paquete DBMS_DDL.WRAP, del cual hablaremos en otro artículo diferente.
Es importante conocer alguna de sus limitaciones antes de aplicarlo, especialmente en entornos productivos, siendo muy importante tener una copia del código PL/SQL y un control de versiones del mismo antes de aplicar el método «wrap» en nuestro código.

Básicamente las limitaciones de la utilidad WRAP, son las siguientes:

Los ficheros ofuscados, en aquellos donde hemos usado wrap, no son compatibles entre releases de Oracle Databases.
No se puede usar wrap en código de triggers.
No es seguro para securizar password o nombres de tablas.
No detecta problemas de sintaxis o errores de código, generados en nuestro código sin ofuscar.
El código ofuscado es más largo que el original.
Wrap solamente ofusca el body de un package o el type, pero no su especificación.

Para ver su funcionamiento vamos a crear una función bastante simple, que posteriormente ofuscaremos con wrap.

CREATE OR REPLACE FUNCTION dia_de_hoy RETURN VARCHAR2 AS
BEGIN
RETURN TO_CHAR(SYSDATE, ‘DD-MON-YYYY HH24:MI:SS’);
END dia_de_hoy;
/

Comprobamos que funciona:


select dia_de_hoy from dual;

DIA_DE_HOY
——————–
31-AGO-2023 20:47:53

Copiamos el código de nuestra función en el sistema operativo.

[oracle@oracleconraul u01]$ cat funcion_dia_de_hoy.sql
CREATE OR REPLACE FUNCTION dia_de_hoy RETURN VARCHAR2 AS
BEGIN
RETURN TO_CHAR(SYSDATE, ‘DD-MON-YYYY HH24:MI:SS’);
END dia_de_hoy;
/

Podemos ver en SQL-Developer el aspecto normal de la función antes de aplicar la ofuscación.

En el sistema operativo lanzamos el comando para ofuscar el código PL-SQL.

La sintaxis es:
wrap iname=<fichero entrada> oname=<fichero de salida ofuscado>

[oracle@localhost u01]$ wrap iname=funcion_dia_de_hoy.sql oname=funcion_dia_de_hoy.out
PL/SQL Wrapper: Release 19.0.0.0.0 – Production on Thu Aug 31 21:17:23 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Processing funcion_dia_de_hoy.sql to funcion_dia_de_hoy.out

La utilidad nos reportará el código ofuscado para se ejecutado.

CREATE OR REPLACE FUNCTION dia_de_hoy wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
74 b6
LH4SgLm3AMbYAySR+WVH9QmeSoAwg8eZgcfLCNL+Xlr6WV+uofByhWTD58CyvbKbXufHdMAz
uHRlCbh0i8DAMv7ShgmpoQLOxtYaIazv1kx2hHEyjndMcfUQc3P17zdnr2pqhduXsevFV1RM
66tN+j1y6a+V638ZlSoZaiQl7Pumz30sVg==
/

Copiamos el código y lo ejecutamos (SqlPlus, SqlDeveloper, etc).

A partir de ahora, todas las nuevas sesiones que conecten a la base de datos no tendrán acceso al código de forma legible, mostrándose el código oculto para los usuarios.





Scroll al inicio