Palavras-chave: Java, hash, MD5, SHA-1, SHA-256, MessageDigest
A maneira mais comum de se gerar um código hash em Java é utilizando a classe java.security.MessageDigest. O método a seguir gera o hash MD5 de uma string:
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(frase.getBytes());
byte[] hashMd5 = md.digest();
O hash é retornado como um array de bytes, que pode ser impresso utilizando o método citado em um post anterior:
private static String stringHexa(byte[] bytes) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
int parteBaixa = bytes[i] & 0xf;
if (parteAlta == 0) s.append('0');
s.append(Integer.toHexString(parteAlta | parteBaixa));
}
return s.toString();
}
Além do MD5, podemos também usar outros algoritmos de hash normalmente presentes nas distribuições da JVM. O exemplo a seguir gera os códigos MD5, SHA-1 e SHA-256 da mesma mensagem:
public static byte[] gerarHash(String frase, String algoritmo) {
try {
MessageDigest md = MessageDigest.getInstance(algoritmo);
md.update(frase.getBytes());
return md.digest();
} catch (NoSuchAlgorithmException e) {
return null;
}
}
public static void main(String[] args) {
String frase = "Quero gerar códigos hash desta mensagem.";
System.out.println(stringHexa(gerarHash(frase, "MD5")));
System.out.println(stringHexa(gerarHash(frase, "SHA-1")));
System.out.println(stringHexa(gerarHash(frase, "SHA-256")));
}
A saída deste programa será:
51408e7592917e916b55f8021a0f7ad3 5907736c4de6fdd70fcdc7517c3aebd257a1addc ed40c896d779f946956483d45e9efe08aac6373935d354c2be2136bf05bca42c







21 comments
Comments feed for this article
16 Outubro 2007 às 19:40
Hugo Santos
Mandou muito bem. Simples e direto ao ponto. Fechou.
7 Novembro 2007 às 12:16
Daniel Naschenweng
Quando o Hexa dá um valor abaixo de 10 ele está perdendo um dígito.
Ex.: ao invés de:
d0970714757783e6cf17b26fb8e2298f
Dá:
d097714757783e6cf17b26fb8e2298f
Pois o Hexa fica 7 ao invés de 07.
Para resolver fiz a adaptação abaixo:
StringBuffer s = new StringBuffer(”");
String hex = new String();
for (int i = 0; i > 4) & 0xf) << 4)
| (bytes[i] & 0xf));
if (hex.length()==1){
s.append(”0″);
}
s.append(hex);
}
return s.toString();
19 Novembro 2007 às 16:46
Tiago Silva
Estou com um problema.
Existe uma aplicação PHP que gera e grava os dados MD5 em uma base de dados mssql.
Estou desenvolvendo uma aplicação em asp.net(csharp) para substituir esse cancer, porém o md5 gerado no meu código csharp não é igual ao que está na base de dados.
alguém sabe porque?
5 Dezembro 2007 às 13:02
Gilmar
sugiro o uso do HexBin pra encode/decode de hex
7 Dezembro 2007 às 11:50
Luiz Gustavo
Daniel, envie esta sua correção por email..
Eu copiei seu código mas deu erro..
Abraços!
11 Dezembro 2007 às 20:48
João Del Valle
Daniel, obrigado pelo toque. Já corrigi o post. ;-)
26 Fevereiro 2008 às 19:30
anonymous
Olá, vc corrigiu a saída do programa também?
5 Março 2008 às 15:48
Lex
cara valeu….você eh o cara !
17 Março 2008 às 19:31
lucas
cara to com um probelamao com este MD5,consigo converter as senhas geradas pelos usuarios ,mas nao consigo logar depois , no game
17 Março 2008 às 19:33
lucas
diz q minha senha esta incorreta alguem sabe como remvo o md5 , do banco de dados, acho q se remover o md5 descomplica, mas nao sei fazer isso
agradeço
20 Março 2008 às 11:07
Renato
Caros,
O trecho de código
int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
int parteBaixa = bytes[i] & 0xf;
if (parteAlta == 0) s.append(’0′);
Não poderia ser substituído por um simples if verificando se o valor é menor igual a 15 e nesse caso fazer um append de zero?
O código ficaria assim:
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] <= 15) s.append(’0′);
s.append(Integer.toHexString(bytes[i]));
}
[]´s
Renato
20 Março 2008 às 11:10
Renato
Esquecam o comentário anterior, estava desconsiderando a parte negativa. :S
[]´s
Renato
22 Abril 2008 às 10:49
Maria
Estou com problemas no envio de do arquivo da CAPESAÚDE (TISS ELETRÔNICO), sempre dá erro.
Aparece a informação abaixo:
** Aguardando comandos…
** C:\Documents and Settings\est13\Meus documentos\ROSI FREIRE\CAPECONSULTA ENVIO DE LOTE 70183-16-04-08.xml: C:\Documents and Settings\est13\Meus documentos\ROSI FREIRE\CAPECONSULTA ENVIO DE LOTE 70183-16-04-08.xml: Mensagem TISS com problemas: “hash” MD5 não confere
Certa de Vossa ajuda! Desde já agradecida.
Respeitosamente,
Mª da Conceição
24 Abril 2008 às 9:33
Maria
Fico grata se poderem me ajudar quanto o problema de “rash MD5″ do arquivo que estou tentando enviar. Sempre dá erro conforme abaixo descrito:
** Aguardando comandos…
** C:\Documents and Settings\est13\Meus documentos\ROSI FREIRE\CAPECONSULTA ENVIO DE LOTE 70183-16-04-08.xml: C:\Documents and Settings\est13\Meus documentos\ROSI FREIRE\CAPECONSULTA ENVIO DE LOTE 70183-16-04-08.xml: Mensagem TISS com problemas: “hash” MD5 não confere
1155CAAC7BD402F89C820852BFB496D9
Certo de Vossa atenção.
Respeitosamente,
Maria da Conceição.
24 Abril 2008 às 10:19
Eduardo Habkost
Maria, os únicos que podem te ajudar são os autores do programa que você está usando.
25 Abril 2008 às 12:05
Maria
São Gonçalo/RJ 25 de abril de 2008.
O programa que utilizo apenas para digitação das guias do convênio é a PLATAFORMA DA ORIZON, mas nós fazemos a exportação do arquivo em XML e enviamos pelo TISS NET, que é um programa gratuito a qual não conseguimos identificar a causa do erro; no entanto não temos suporte da mesma, pois nem o convênio, nem nossa empresa tem contrato com a ORIZON.
Será que alguém pode me dá uma dica como resolver esse problema que está abaixo descrito: (Mensagem TISS com problemas: “hash” MD5 não confere)
** Aguardando comandos…
** C:\Documents and Settings\est13\Meus documentos\ROSI FREIRE\CAPECONSULTA ENVIO DE LOTE 70183-16-04-08.xml: C:\Documents and Settings\est13\Meus documentos\ROSI FREIRE\CAPECONSULTA ENVIO DE LOTE 70183-16-04-08.xml: Mensagem TISS com problemas: “hash” MD5 não confere
1155CAAC7BD402F89C820852BFB496D9
Mais uma vez grata pela atenção.
Respeitosamente,
Maria da Conceição
Faturamento CONLAB
25 Abril 2008 às 12:13
Maria
TISS NET é um programa gratuito criado pela ANS, mas é impossível conseguir falar com eles.
Respeitosamente,
Maria da Conceição.
Faturamento
25 Abril 2008 às 13:38
Maria
São Gonçalo/RJ
Obrigada pela atenção Eduardo Habkost! Se você tiver como me passar alguma informação a respeito do assunto que enviei anteriormente, fico agradecida.
Respeitosamente,
Maria da Conceição
Faturamneto CONLAB
27 Abril 2008 às 17:37
MD5 não confere
Maria da Conceição,
O problema está no sistema que gerou o XML.
Para resolver o problema desta guia, clique no link ao lago ou no site abaixo:
evandro.net/tiss/tiss-hash-md5-nao-confere.html
O Hash MD5 é um epílogo (encerramento) que garante que nenhuma informação do XML foi alterada, seja ela manualmente ou na transmissão dos dados, como uma assinatura eletrônica daquele documento.
27 Abril 2008 às 17:39
MD5 não confere
Maria da Conceição,
O problema está no sistema que gerou o XML.
Para resolver o problema desta guia, clique no link “MD5 não confere” no lado esquerdo ou entre no site abaixo:
evandro.net/tiss/tiss-hash-md5-nao-confere.html
O Hash MD5 é um epílogo (encerramento) que garante que nenhuma informação do XML foi alterada, seja ela manualmente ou na transmissão dos dados, como uma assinatura eletrônica daquele documento.
27 Outubro 2008 às 11:16
Cássio Oliveira
Como seria para gerar o arquivo hash de um arquivo?
Tentei fazer este processo lendo linha a linha do arquivo… Mas não deu certo por aqui…