Uma forma de efetuar o checksum do seu fonte pl/sql

Postado em Dezembro 17th, 2011 sobre Oracle Database,PL/SQL,Segurança por Rafael Stoever

Lendo sobre segurança no Oracle encontrei algo muito interessante para os desenvolvedores e no controle de versão de seus fontes no cliente.
Já pensou em ter um valor hash do seu fonte para identificar se houve alteração no seu cliente a partir de dentro do Oracle?

É isso mesmo você como desenvolvedor pode fechar a versão e ao invés de ficar usando programas externos e tals pode controlar as versões tudo pelos códigos hash´s dos seus fontes.
Ai o controle fica ao seu encargo.

Tenho por exemplo de uma procedure chamada get_idade que podesmo usar:

  CREATE OR REPLACE FUNCTION "PRODUCAO"."GET_IDADE" (p_codpessoa number)
return number as
w_age number(11);
begin
       Select Trunc ( (SYSDATE - a.dtnascimento) /365, 0 ) into w_age
         from pessoa a
       where codpessoa = p_codpessoa;

       return w_age;
end;

Utilizando a package dbms_utility e a função get_hash_value fazemos os calculos para obter o seu hash e assim ter um checksum.
No meu caso utilizei o avg para média entre todos os hashes.

DBMS_UTILITY.GET_HASH_VALUE (
   name      VARCHAR2,
   base      NUMBER,
   hash_size NUMBER)
  RETURN NUMBER;

Onde:
name é a string a ser hashed;
base é o valor de base para o valor retornado de hash para inicio.
hash_size é o tamanho designado para a tabela hash.

SELECT AVG(DBMS_UTILITY.GET_HASH_VALUE(TEXT,1000000000,POWER(2,30))) AS CHECKSUM FROM DBA_SOURCE WHERE OWNER ='PRODUCAO' AND NAME ='GET_IDADE';
                                          CHECKSUM
--------------------------------------------------
                                        1609903818

Agora se eu alterar o codigo com um simples enter no seu fonte:

  CREATE OR REPLACE FUNCTION "PRODUCAO"."GET_IDADE" (p_codpessoa number)
return number as
w_age number(11);
begin
       Select Trunc ( (SYSDATE - a.dtnascimento) /365, 0 ) into w_age
         from pessoa a
       where codpessoa = p_codpessoa;

       return w_age;

end;
                                          CHECKSUM
--------------------------------------------------
         1629657837.181818181818181818181818181818

Agora um exemplo simples pegando todos os valores hash de todos os objetos o seu owner de produção.

SQL> SELECT name,AVG(DBMS_UTILITY.GET_HASH_VALUE(TEXT,1000000000,POWER(2,30))) AS CHECKSUM FROM DBA_SOURCE WHERE OWNER ='PRODUCAO' group by name;

NAME                                                                     CHECKSUM
------------------------------ --------------------------------------------------
ATUAENTSAINOTA                                                    1606026670.8125
GERAPROMOCAO                            1627241324.171428571428571428571428571429
FGERARANDOMNOME                                                      1580305263.9
GERARMOVIMENTO                          1636410989.882978723404255319148936170213
CRIAITEM                                                            1570842205.44
GERARPRODUTO                            1672790823.928571428571428571428571428571
GET_IDADE                               1629657837.181818181818181818181818181818
MANUPROMOCAO                                                      1612685026.5625
FGERATPPESSOA                           1539805137.071428571428571428571428571429
CRIANOTA                                1456069025.916666666666666666666666666667

Maiores detalhes sobre a package PL/SQL Packages and Types Reference 10gR1

Este artigo lhe ajudou?


Contribua para manutencao do site !

Sobre Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Teiko Soluções em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever e Mysql e programação web (php,asp).

Tags: , , , , , , , , , , , ,

Uma Resposta para 'Uma forma de efetuar o checksum do seu fonte pl/sql'

Deixe um comentario




XHTML::
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>