Encriptar código almacenado en la BD Oracle

Si has creado algún documento interesante, este es su sitio

Moderador: Moderadores

Encriptar código almacenado en la BD Oracle

Notapor Yorkshire » Jue Jun 02, 2005 5:14 pm

Encriptar código almacenado en la BD Oracle

Versión de la base de datos: 8i (8.1.7)
Sistema operativo: Irrelevante. En este ejemplo, Windows NT 4


¿Qué queremos hacer?
Bien, pues ciertamente, lo que reza el título: Crear funciones, procedimientos, etc... almacenados en la base de datos, pero que esten encriptados para que su código fuente no esté visible.

¿Y eso por qué?
Pues porque a veces hay código "sensible" a miradas curiosas de los usuarios. Hay quien deja escritos passwords "críticos" en el código fuente de algunos procesos almacenados (no es mi caso), pero también puede sernos útil para "esconder" de miradas ajenas otras cosas. Por ejemplo, una función de encriptación de passwords/mensajes/textos de una aplicación (seguro que se os ocurren otras aplicaciones).

¿Cómo se hace?
Muy fácil. Escribimos nuestra función en un documento de texto, por ejemplo, funcion.sql y lo grabamos. Supongamos que ésta es nuestra función:
Código: Seleccionar todo
create or replace Function ENCRIPTACION(texto IN varchar2) return varchar2 IS
  ValorAscii NUMBER;
  CaracterEncriptado NUMBER(4);
  ClaveEncriptada VARCHAR2(100);
  Longitud NUMBER;
BEGIN
  Longitud := LENGTH(texto);
  FOR I IN 1..Longitud LOOP
    ValorAscii := ASCII(SUBSTR(UPPER(texto),I,1));
    IF (ValorAscii NOT BETWEEN 65 AND 90) AND (ValorAscii NOT BETWEEN 48 AND 57) THEN
      RAISE_APPLICATION_ERROR(-20000,'ERROR: VALORES NO PERMITIDOS '||SQLERRM);
      RETURN null;
    END IF;
    CaracterEncriptado := expresion_de_encriptacion_de_caracter ;
    ClaveEncriptada := ClaveEncriptada || to_char(CaracterEncriptado);
  END LOOP;
  RETURN ClaveEncriptada;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20000,'Error en la Clave. '||SQLERRM);
    RETURN null; 
END;

Para el que le suene, se trata de PL/SQL puro y duro. La expresión de encriptación de carácter sería una expresión que cada uno se haría a su gusto.

Una vez tenemos el fichero funcion.sql, lo que hacemos es irnos al directorio \ORAHOME\bin y ejecutar el comando wrap con funcion.sql como el fichero de entrada y un nombre para el fichero de salida:
Código: Seleccionar todo
D:\oracle\ora81\bin>wrap iname=s:\encripta\funcion.sql oname=s:\encripta\funcion.cript

PL/SQL Wrapper: Release 8.1.7.0.0 - Production on Jue Jun 02 11:49:58 2005

Copyright (c) Oracle Corporation 1993, 2000.  All Rights Reserved.

Processing s:\encripta\funcion.sql to s:\encripta\funcion.cript

D:\oracle\ora81\bin>


Con esto hemos obtenido un fichero funcion.cript cuyo contenido si lo abris desde un editor será casi ilegible:
Código: Seleccionar todo
create or replace Function ENCRIPTACION wrapped
0
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
3
8
8106000
1
4
0
26
2 :e:
1FUNCTION:
1ENCRIPTACION:
1TEXTO:
1VARCHAR2:
1RETURN:
1VALORASCII:
1NUMBER:
1CARACTERENCRIPTADO:
14:
1CLAVEENCRIPTADA:
1100:
1LONGITUD:
1LENGTH:
1I:
11:
1LOOP:
1ASCII:
1SUBSTR:
1UPPER:
165:
190:
148:
157:
1RAISE_APPLICATION_ERROR:
1-:
120000:
1SGR-20001. VALORES NO PERMITIDOS :
1||:
1SQLERRM:
1TRUNC:
1/:
1+:
10.23:
12:
1*:
1TO_CHAR:
1OTHERS:
1Error en la Clave. Es posible que su longitud exceda de 10 caracteres. :
0

0
0
a2
2
0 a0 1d 8d 8f a0 b0 3d
b4 :2 a0 a3 2c 6a a0 1c 81
b0 a3 a0 51 a5 1c 81 b0
a3 a0 51 a5 1c 81 b0 a3
a0 1c 81 b0 :3 a0 a5 b d
91 51 :2 a0 63 37 :5 a0 a5 b
a0 51 a5 b a5 b d a0
4c :2 51 48 63 5a a0 4c :2 51
48 63 5a a 10 a0 7e 51
b4 2e 6e 7e a0 b4 2e a5
57 a0 4d 65 b7 19 3c :3 a0
5a 7e 51 b4 2e 5a 7e 51
b4 2e 51 a5 b 7e 51 b4
2e d :2 a0 7e :2 a0 a5 b b4
2e d b7 a0 47 :2 a0 65 b7
a0 53 a0 7e 51 b4 2e 6e
7e a0 b4 2e a5 57 a0 4d
65 b7 a6 9 a4 b1 11 68
4f 17 b5
a2
2
0 3 7 8 21 1d 1c 29
19 2e 32 52 3a 3e 42 46
4e 39 6e 5d 36 61 62 6a
5c 8a 79 59 7d 7e 86 78
a5 95 99 a1 75 91 ac b0
b4 b5 b7 bb bf c2 c6 ca
cd cf d3 d7 db df e3 e4
e6 ea ed ee f0 f1 f3 f7
1 fb fe 101 104 107 10a 1
10e 111 114 117 11a 1 11d 122
126 129 12c 12d 132 137 13a 13e
13f 144 145 14a 14e 14f 153 155
159 15c 160 164 168 16b 16e 171
172 177 17a 17d 180 181 186 189
18a 18c 18f 192 193 198 19c 1a0
1a4 1a7 1ab 1af 1b0 1b2 1b3 1b8
1bc 1be 1c2 1c9 1cd 1d1 1d5 1d7
1 1db 1df 1e2 1e5 1e6 1eb 1f0
1f3 1f7 1f8 1fd 1fe 203 207 208
20c 20e 20f 214 218 21a 226 22a
22c 235
a2
2
0 :2 1 a 17 20 :2 17 16 2a
31 3 :2 1 :3 e :2 3 16 1d 1c
:2 16 :2 3 13 1c 1b :2 13 :2 3 :3 c
:2 3 f 16 :2 f 3 7 c f
18 c 3 5 13 19 20 26
:2 20 2d 2f :2 19 :2 13 5 9 14
20 27 :2 9 8 30 3b 47 4e
:2 30 2f :2 8 7 1f 20 :2 1f 26
49 4b :2 26 :3 7 e 7 52 :3 5
1b 23 22 2e 2f :2 22 21 31
32 :2 21 37 :2 1b 39 3a :2 1b :2 5
18 28 2b 33 :2 2b :2 18 5 18
7 :2 3 a 3 1 :2 8 5 1d
1e :2 1d 24 6d 6f :2 24 :3 5 c
5 f :2 3 :7 1
a2
2
0 :a 1 2 :2 1 :4 2 :7 3 :7 4 :5 5
:6 7 :6 8 :e 9 :10 a :c b :3 c :3 a :15 e
:a f 8 10 8 :3 11 6 :2 13 :c 14
:3 15 :3 13 12 :3 1 16 :2 1
237
4
:3 0 1 :4 0 2
:a 0 9e 1 :4 0
5 :2 0 3 4
:3 0 3 :7 0 6
5 :3 0 5 :3 0
4 :3 0 9 :2 0
7 8 a 0
9e 3 c :2 0
7 :3 0 e :7 0
11 f 0 9c
6 :6 0 b :2 0
b 7 :3 0 9
13 15 :6 0 18
16 0 9c 8
:6 0 11 91 0
f 4 :3 0 d
1a 1c :6 0 1f
1d 0 9c a
:6 0 c :3 0 7
:3 0 21 :7 0 24
22 0 9c c
:6 0 d :3 0 3
:3 0 13 26 28
25 29 0 86
e :3 0 f :2 0
c :3 0 10 :3 0
2c 2d 0 2b
2f 6 :3 0 11
:3 0 12 :3 0 13
:3 0 3 :3 0 15
34 36 e :3 0
f :2 0 17 33
3a 1b 32 3c
31 3d 0 80
6 :3 0 14 :2 0
15 :2 0 3f 40
44 41 42 0
43 :2 0 6 :3 0
16 :2 0 17 :2 0
46 47 4b 48
49 0 4a :2 0
45 4d 4c :2 0
18 :3 0 19 :2 0
1a :2 0 1d 50
52 :3 0 1b :4 0
1c :2 0 1d :3 0
1f 55 57 :3 0
22 4f 59 :2 0
5e 5 :4 0 5c
:2 0 5e 25 5f
4e 5e 0 60
28 0 80 8
:3 0 1e :3 0 6
:3 0 63 :2 0 1f
:2 0 9 :2 0 2a
65 67 :3 0 68
:2 0 20 :2 0 21
:2 0 2d 6a 6c
:3 0 22 :2 0 30
62 6f 23 :2 0
b :2 0 33 71
73 :3 0 61 74
0 80 a :3 0
a :3 0 1c :2 0
24 :3 0 8 :3 0
36 79 7b 38
78 7d :3 0 76
7e 0 80 3b
82 10 :3 0 30
80 :4 0 86 5
:3 0 a :3 0 84
:2 0 86 40 9d
25 :3 0 18 :3 0
19 :2 0 1a :2 0
44 8a 8c :3 0
26 :4 0 1c :2 0
1d :3 0 46 8f
91 :3 0 49 89
93 :2 0 98 5
:4 0 96 :2 0 98
58 9a 4f 99
98 :2 0 9b 51
:2 0 9d 53 9d
9c 86 9b :6 0
9e :2 0 3 c
9d a0 :2 0 2
9e a1 :8 0
5c
4
:2 0 4c 1 4
1 7 1 b
1 14 1 12
1 1b 1 19
1 20 1 27
1 35 3 37
38 39 1 3b
1 51 2 54
56 2 53 58
2 5a 5d 1
5f 2 64 66
2 69 6b 2
6d 6e 2 70
72 1 7a 2
77 7c 4 3e
60 75 7f 3
2a 82 85 1
8b 2 8e 90
2 8d 92 3
:2 0 1 88 1
9a 4 10 17
1e 23 3 94
97 9f
1
4
0
a0
0
1
14
2
7
0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0
19 1 0
3 0 1
b 1 0
2b 2 0
20 1 0
12 1 0
4 1 0
0

/


¿Y cómo meto ese código tan raro en la base de datos como una función?
Tan sencillo como desde SQL Plus hacer:
Código: Seleccionar todo
SQL> @s:\encripta\funcion.cript


Podréis comprobar como se ha creado la función de base de datos ENCRIPTACION y a cuyo fuente no se accede. :badgrin: :badgrin:

Ventajas y Desventajas
Las ventajas están claras. Ocultar código fuente que no queramos que "se vea" en la base de datos.
La desventaja principal es que deberemos tener un lugar (carpeta) donde almacenar nuestros códigos en texto plano para poder hacer modificaciones en caso de ser necesarias y volver a incorporarlas en la BD, ya que sobre el código encriptado no se puede modificar nada.

Salu2
Linux registered user #346840
Avatar de Usuario
Yorkshire
Gran Wadalbertita
Gran Wadalbertita
 
Mensajes: 4488
Registrado: Mié Ene 26, 2005 5:05 pm
Ubicación: -<|:-P[G]

Volver a Faq

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado