Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 e navegador Mozilla Firefox

domingo, 4 de novembro de 2007

Utlizando MD5 no Oracle para geração de senhas

Olá,


Como muito de vocês já sabem, e de acordo com a nossa enciclopédia, o MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, e muito utilizado por softwares com protocolo ponto-a-ponto (P2P, ou Peer-to-Peer, em inglês), verificação de integridade e logins.

Foi desenvolvido em 1991 por Ronald Rivest para suceder ao MD4 que tinha alguns problemas de segurança. Por ser um algoritmo unidirecional, uma hash md5 não pode ser transformada novamente no texto que lhe deu origem. O método de verificação é, então, feito pela comparação das duas hash (uma da base de dados, e a outra da tentativa de login). O MD5 também é usado pera verificar a integridade de um ficheiro através, por exemplo, do programa md5sum, que cria a hash de um ficheiro. Isto pode-se tornar muito útil para downloads de ficheiros grandes, para programas P2P que constroem o ficheiro através de pedaços e estão sujeitos à corrupção dos mesmos. Como autenticação de login é utilizada em vários sistemas operacionais unix e em muitos sites com autentificação.

Antigamente, era muito comum ver desenvolvedores de sistemas se perguntando qual a melhor maneira de criptograr uma senha de login de usuário de sistema e armazená-la no banco de dados. Eu mesmo já vi vários algoritmos que realizam criptografia utilizando operadores OR, XOR e que fazem contas matemáticas utilizando a tabela ASCII junto com as funções CHR(), REVERSE() e ASCII() para que a senha de um usuário seja criptografada e posteriormente caso necessário descriptografada. No meu ponto de vista, uma senha de login de usuário que já foi criptografada, não deve ter um procedimento de descriptografia. Digo isso, porque uma senha de acesso só deve ser de conhecimento de seu dono, portanto, ter um procedimento que gera o valor original de uma string criptografada poderá ocasionar sérios problemas de segurança caso o detentor ou conhecedor desta rotina possa estar com más intenções.

Na verdade, o algorítimo MD5 não é exatamente um algorítimo de criptografia, mas pode ser usado como tal exatamente porque ele é unidirecional e como dito acima o conteúdo da string não pode ser transformada novamente no texto que lhe deu origem.

Como podemos tirar proveito do MD5 no Oracle ?

Na verdade, a senha do usuário não será armazenada exatamente como uma string, mas sim como um MD5 hash gerado a partir da verdadeira senha. No exemplo abaixo a ser mostrado, a função MD5 receberá a senha e a retornará na forma de um número hexadecimal com 32 caracteres. Como não existe uma chave de decodificação, então, não será possível pegar este valor de hash e transformá-lo de volta em string.

Bem, farei uso do pacote DBMS_OBFUSCATION_TOOLKIT, presente desde a versão do Oracle 8i, para demonstrar como gerar um um valor hash.


LEGATTI@ORACLE10> set serveroutput on

LEGATTI@ORACLE10> declare
2 v_input varchar2(2000) := 'minhasenha';
3 hexkey varchar2(32) := null;
4 begin
5 hexkey := rawtohex(dbms_obfuscation_toolkit.md5(input => utl_raw.cast_to_raw(v_input)));
6 dbms_output.put_line('O valor hash para "' || v_input || '" é "' || nvl(hexkey, '')||'".');
7 end;
8 /
O valor hash para "minhasenha" é "7C67E713A4B4139702DE1A4FAC672344".

Procedimento PL/SQL concluído com sucesso.


Agora irei criar uma função na qual será preciso passar como parâmetro apenas a string que se deseja que seja criado o valor hash:

LEGATTI@ORACLE10> create or replace function md5 (valor varchar) return varchar2 is
2 v_input varchar2(2000) := valor;
3 hexkey varchar2(32) := null;
4 begin
5 hexkey := rawtohex(dbms_obfuscation_toolkit.md5(input => utl_raw.cast_to_raw(v_input)));
6 return nvl(hexkey,'');
7 end;
8 /

Função criada.

LEGATTI@ORACLE10> select md5('minhasenha') from dual;

MD5('MINHASENHA')
--------------------------------

7C67E713A4B4139702DE1A4FAC672344

LEGATTI@ORACLE10> select 'TRUE' from dual
2 where '7C67E713A4B4139702DE1A4FAC672344' = md5('minhasenha_errada');

não há linhas selecionadas

LEGATTI@ORACLE10> select 'TRUE' from dual
2 where '7C67E713A4B4139702DE1A4FAC672344' = md5('minhasenha');

'TRU
----
TRUE

Pronto. Como demonstrado acima, agora é só utilizar a função MD5 criada acima para gerar o valor hash e armazenar este valor na tabela e campo apropriados.

Caso queira validar o hash gerado, acesse este link e teste o valor como mostrado na figura abaixo:

Para maiores informações sobre algoritmos de criptografia como DES, 3DES, AES, RC4, 3DES_2KEY e uso dos procedimentos disponíveis nos pacotes DBMS_OBFUSCATION_TOOLKIT e também no pacote DBMS_CRYPTO (disponível no 10g), acesse a documentação no site oficial da Oracle.

2 comentários:

slex disse...

Muito bom o artigo, parabéns

Carlos Wherbet disse...

Ótimo, vou aprender muito com esse BLOG!!

Creative Commons License
Oracle Blog by Eduardo Legatti is licensed under a Creative Commons Atribuição-Uso Não-Comercial 2.5 Brasil License.
Oracle Blog não se responsabiliza pelo uso dos códigos e informações aqui fornecidas.

Outros Artigos

 
BlogBlogs.Com.Br