Académique Documents
Professionnel Documents
Culture Documents
GUIDE
Gua
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
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
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