Java: Gerando códigos hash (MD5, SHA)

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
This entry was posted in Java. Bookmark the permalink.

26 Responses to Java: Gerando códigos hash (MD5, SHA)

  1. Hugo Santos says:

    Mandou muito bem. Simples e direto ao ponto. Fechou.

  2. Daniel Naschenweng says:

    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();

  3. Tiago Silva says:

    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?

  4. Gilmar says:

    sugiro o uso do HexBin pra encode/decode de hex

  5. Luiz Gustavo says:

    Daniel, envie esta sua correção por email..
    Eu copiei seu código mas deu erro..
    Abraços!

  6. Daniel, obrigado pelo toque. Já corrigi o post. ;-)

  7. anonymous says:

    Olá, vc corrigiu a saída do programa também?

  8. Lex says:

    cara valeu….você eh o cara !

  9. lucas says:

    cara to com um probelamao com este MD5,consigo converter as senhas geradas pelos usuarios ,mas nao consigo logar depois , no game

  10. lucas says:

    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

  11. Renato says:

    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

  12. Renato says:

    Esquecam o comentário anterior, estava desconsiderando a parte negativa. :S

    []´s
    Renato

  13. Maria says:

    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

  14. Maria says:

    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.

  15. Maria, os únicos que podem te ajudar são os autores do programa que você está usando.

  16. Maria says:

    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

  17. Maria says:

    TISS NET é um programa gratuito criado pela ANS, mas é impossível conseguir falar com eles.

    Respeitosamente,

    Maria da Conceição.
    Faturamento

  18. Maria says:

    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

  19. 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.

  20. 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.

  21. 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…

  22. marcus says:

    tambem estou com o mesmo problema do hash do cassio
    primeiramente tentei jogar todo o texto dentro da funcao q calcula o hash e n deu certo
    depois li que o calculo do hash eh soh os valores e nao as tags xml
    passei o dia ontem adaptando pra pegar os valores e colocar numa stringona.. mandei calcular o hash e ainda apresenta erro
    estou meio sem saida!

  23. Ronaldo says:

    João Del Valle, estou com problemas, para emitir nota fiscal feita na impressora laser e que pra ter validade tem decolocar achave md5 na nota e posteriormente todas as notas gravadas mensalmente em imagem iso com o md5 para garantir a integridade.

    meu sistema é em vb voce pode me ajudar a resolver isso.

  24. pedro says:

    cara….

    o SHA tem as seguintes formas….

    SHA-1
    SHA-256
    e SHA – 512.

    se vc substituir o trecho do código acima do POST por SHA-512 ele dá ainda mais segurança.

    irá gerar um código de 512 caracteres.

    enquanto o md5 gera 32 caracteres.

    Especialistas estimam que para
    alguém conseguir quebrar uma criptografia usando chaves de 64 bits na base da tentativa e erro,
    levaria cerca de 100.000 anos usando um PC comum.
    Mas porque é tão seguro? Simples, uma chave de 2 bits terá 4 combinações possíveis.
    Uma chave de 4 bits, terá 16 combinações possíveis e assim por diante. Agora,
    vejamos a grande diferença: uma chave de apenas 8 bits terá 65.356 combinações possíveis e,
    em uma chave de 32 bits existem mais de 4 bilhões de combinações, que para serem decifradas
    levariam mais de 2 meses (levando em conta 1000 tentativas por segundo, por parte do computador).

    AGORA IMAGINA 512 CARACTERS????

    tenta ai galera… to tentanuh aqui e naum to conseguindo naum…kkkkk

    vlwsss

  25. César says:

    Boa tarde galera e Arimateia, tudo bem com vocês?
    Seguinte, como recentemente tive a necessidade de fazer o calculo do hash em arquivos xml padrão tiss, desenvolvi um script em python que pode calcular o hash de qualquer arquivo xml, e publiquei no vivaolinux , além do calculo do hash onde o sistema entra em todos os nodos do xml de forma recurssiva, ele mostra na tela a estrutura do arquivo xml em formato de arvore, como o conhecimento é para desfruto de todos, espero que ajude pessoas que precisem calcular o hash varias vezes por algum motivo, e o xml seja maior que o padrão da ans (100 guias), ou pessoas que necessitem somente extrair o conteúdo dos seus arquivos e visualizar a estrutura.
    Vlw galera e um forte agraço
    link: http://www.vivaolinux.com.br/script/Leitura-de-todos-os-valores-de-qualquer-xml

  26. Lucas Amparo says:

    Valeu, meu brother. Ajudou pacas aqui. Sucesso.

Comments are closed.