terça-feira, 16 de abril de 2013

Como encriptar um código PL/SQL


Durante o desenvolvimento de regras de negócio, muitas vezes a equipe de desenvolvimento precisa “encriptar” o código para protegê-lo de direitos autorais ou mesmo para evitar que outras pessoas alterem o código inadivertidamente.

Para “encriptar” códigos de PL/SQL no banco de dados, deve-se usar o utilitário “wrap”.

Os arquivos de fontes “encriptados” podem ser movidos, copiados, e executados no SQL*Plus ou por utilitários de importação e exportação (exp/imp ou datapump).

Os códigos “encriptados” não podem ser visualizados no banco de dados.

A “encriptação” pode ser realizada para:

§  FUNCTION
§  PROCEDURE
§  PACKAGE
§  PACKAGE BODY
§  TYPE
§  TYPE BODY

A sintaxe para usar o utilitário é:

wrap iname=[nome_codigo_fonte][oname=nome_codigo_encriptado]
 
Para testar o comando “wrap” vamos criar um código para teste, segue abaixo.
 
$ vi teste_wrap.sql
 
CREATE OR REPLACE PROCEDURE TESTE_DE_WRAP
IS
 
CURSOR DB_STATUS IS
select host_name,
       to_char(STARTUP_TIME, 'dd-mm-yyyy HH24:mi:ss') STARTUP,
       trunc(SYSDATE-(STARTUP_TIME)) DAY
  from sys.v_$instance;
 
BEGIN
   FOR WDB_STATUS IN DB_STATUS LOOP
    dbms_output.put_line('Nome do Servidor : ' ||WDB_STATUS.host_name);
    dbms_output.put_line('Startup          : ' ||WDB_STATUS.STARTUP); 
    dbms_output.put_line('Qdte. Dias       : ' ||WDB_STATUS.DAY) ;
   END LOOP;
END;
/
 
Depois de validar o código na compilação, vamos “encriptar” o código fonte da procedure.
 
$ wrap iname=teste_wrap.sql oname=teste_wrap.plb
 
PL/SQL Wrapper: Release 11.2.0.1.0- 64bit Production on Fri Apr 05 14:56:58 2013
Copyright (c) 1993, 2009, Oracle.  All rights reserved.
 
Processing teste_wrap.sql to teste_wrap.plb



Depois da “encriptação” o arquivo fonte “teste.wrap.sql” gerou um arquivo de saída chamado “teste_wrap.plb”.
 
Abaixo segue o conteúdo do arquivo “teste_wrap.plb”.
 
$ cat teste_wrap.plb
 
CREATE OR REPLACE PROCEDURE TESTE_DE_WRAP wrapped
a000000
b2
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
1d1 181
EqW1Ewvh4oT9lWBsDzHJz3EW1BEwgxDI1ydGfI4CmP9eaOk1HT3pKSdxlV3clCEtOil8CnwO
mR/gzLoWR2p4DWpHiSWtL+f6+r9yoYyUgO4hrOkLs5nS2terCavmU+tg3i++eKeTF8p2q9jI
uhaJLYfCqyzn5IXFcpnohnA9PCoZp+7TUWEuQKg6dKxRMM+DdHPJQe+eSQVDvp/xxskgNgN1
5FFpnqzN1lIKXLKv8byS+Ak5bV118/GGxz6drQUvn7+NK4fpZIknPJNmZPDq/9//6Dg65YkE
gMB2exGAfFXSs8SGNv3jjzA0UCXHC+xVj3VDfGK7ILg8LP8miNePOYtjTEWOoqp1tWpGLGtL
GzU+PJ+IvZiKuZk0hxK5
/
 
Observe que o cabeçalho da procedure ficou mantido, porém todo o código ficou “encriptado”.
 
Agora vamos compilar a procedure, utilizando o arquivo “encriptado”.
 
SQL> @teste_wrap.plb
 
Procedure created.
 
A procedure foi compilada com sucesso, porém se verificarmos o conteúdo da procedure dentro do banco de dados também não poderemos ver os detalhes do código.
 
SQL> SELECT text FROM USER_SOURCE WHERE name = 'TESTE_DE_WRAP';
 
TEXT
--------------------------------------------------------------------------------
PROCEDURE TESTE_DE_WRAP wrapped
a000000
b2
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
7
1d1 181
EqW1Ewvh4oT9lWBsDzHJz3EW1BEwgxDI1ydGfI4CmP9eaOk1HT3pKSdxlV3clCEtOil8CnwO
mR/gzLoWR2p4DWpHiSWtL+f6+r9yoYyUgO4hrOkLs5nS2terCavmU+tg3i++eKeTF8p2q9jI
uhaJLYfCqyzn5IXFcpnohnA9PCoZp+7TUWEuQKg6dKxRMM+DdHPJQe+eSQVDvp/xxskgNgN1
5FFpnqzN1lIKXLKv8byS+Ak5bV118/GGxz6drQUvn7+NK4fpZIknPJNmZPDq/9//6Dg65YkE
gMB2exGAfFXSs8SGNv3jjzA0UCXHC+xVj3VDfGK7ILg8LP8miNePOYtjTEWOoqp1tWpGLGtL
GzU+PJ+IvZiKuZk0hxK5
 
Agora vamos executar a procedure para verificar o funcionamento.
 
SQL> set serveroutput on
SQL> exec dbms_output.enable(1000000);
 
PL/SQL procedure successfully completed.
 
SQL> exec TESTE_DE_WRAP
 
Nome do Servidor : db_teste.ux
Startup          : 12-04-2013 02:40:42
Qdte. Dias       : 4

PL/SQL procedure successfully completed.

Algumas limitações do utilitário “wrap”.

§  O código de PL / SQL para ser “encriptado” não pode ter  variáveis ​​de substituição usando o SQL * Plus (DEFINE).
§  O código fonte “encriptado” é analisado pelo compilador de código  PL/SQL, e não pelo SQL * Plus.
§  O utilitário “wrap” remove a maioria dos comentários dos arquivos envolvidos.

Referências: Oracle® Database PL/SQL Language Reference 11g Release 2 (11.2)



MSc. Rubens Oliveira
DBA Oracle Consultor