com.mhavila.cookbook.crypto
Class RecipeMessageDigest

java.lang.Object
  extended by com.mhavila.cookbook.crypto.RecipeMessageDigest

public class RecipeMessageDigest
extends Object

Receita:
Gerar um resumo de verificação de um conteúdo/texto de entrada, usando os algoritmos de message digest MD5 ou SHA-1. A API java.security provê, desde o JDK 1.3, os recursos para isto. Para gerar uma saída legível, usamos também o pacote Commons Codec, do projeto Apache Jakarta.

Commons Codec:

Instalação:

  1. Faça o download da versão mais recente do Apache Commons Codec. A numeração da versão é referenciada aqui como VERSAO. Esta receita foi testada com a versão 1.3.
  2. Descompacte o pacote commons-codec-VERSAO.tar.gz ou commons-codec-VERSAO.zip. A localização da pasta destino que você escolher é refenciada aqui como CODEC_HOME.
  3. Em seu projeto, copie e adicione ao CLASSPATH o arquivo CODEC_HOME/commons-codec-VERSAO.jar.
  4. Adicione aos imports da classe que implementará o resuma as seguintes classes: java.security.MessageDigest, java.security.NoSuchAlgorithmException e org.apache.commons.codec.Hex.
Preparação:
A fase de preparação requer obter instâncias dos objetos que executam os algoritmos utilizados. Os dois algoritmos mais usados para resumo (digest) são o MD5 (Message Digest #5), desenvolvido pelos Laboratórios da RSA, e o SHA-1 (Secure Hash Algorithm #1), padronizado e adotado pela Agência Nacional de Segurança dos EUA. O MD5 é um algoritmo muito rápido e largamente utilizado para verificação de integridade de conteúdo, suficiente para a maior parte das aplicações. Contudo, nos anos recentes foram descobertas algumas vulnerabilidades de segurança no MD5, que o tornam inapropriado quando é necessário um alto grau de segurança quanto à fraudes e ataques. Já o algoritmo SHA-1 é mais moderno e considerado bastante seguro, como diz seu próprio nome.
  1. Obter uma instância do algoritmo de digest a ser utilizado: MessageDigest md = MessageDigest.getInstance("MD5") ou MessageDigest md = MessageDigest.getInstance("SHA-1")
  2. Obter uma instância do codec hexadecimal, para gerar uma saída legível: Hex codec = new org.apache.commons.codec.binary.Hex()
Uso:
O processo de geração de resumo (digest) trabalha sempre com array de bytes. O algoritmo MD5 retorna um resumo de 16 bytes, enquanto o SHA-1 retorna 20 bytes. Como a visualização em hexadecimal ([0-9a-f]) gera dois caracteres para cada byte, a saída exibida corresponde, portanto, a 32 caracteres hexa para o MD5 e 40 caracteres para o SHA-1.
  1. Caso a entrada seja texto String, obter o array de bytes correspondente: byte[] bytes = entrada.getBytes()
  2. Gerar o resumo: byte[] digest = md.digest(bytes)
  3. Codificar o resumo para uma sequência de bytes contendo caracteres hexadecimais, para saída legível: byte[] digestHex = codec.encode(digest)
  4. Converter o array de bytes de caracteres hexadecimais em texto String: String saida = new String(digestHex)
Exemplo de código:
public static String md5(String entrada)
{
        // Gera o resumo de validação (digest) da mensagem entrada
        try {
                MessageDigest md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
                return null; // "MD5" é algoritmo válido, esta exceção não ocorre.
        }
        byte[] digest = md.digest(entrada.getBytes());

        // Converte a saída em texto legível
        Hex codec = new Hex();
        return new String(codec.encode(digest));
}

Referências:

Since:
JDK 1.3
Author:
Márcio d'Ávila (www.mhavila.com)
See Also:
MessageDigest, MessageDigest.getInstance(String), Hex

Constructor Summary
RecipeMessageDigest()
           
 
Method Summary
(package private) static String digest(String entrada, String algoritmo)
           
static void main(String[] args)
           
static String md5(String entrada)
           
static String sha1(String entrada)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

RecipeMessageDigest

public RecipeMessageDigest()
Method Detail

digest

static String digest(String entrada,
                     String algoritmo)
              throws NoSuchAlgorithmException
Throws:
NoSuchAlgorithmException

md5

public static String md5(String entrada)

sha1

public static String sha1(String entrada)

main

public static void main(String[] args)
Parameters:
args -
Throws:
NoSuchAlgorithmException