com.mhavila.cookbook.crypto
Class RecipeMessageDigest
java.lang.Object
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:
- 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.
- 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.
- Em seu projeto, copie e adicione ao CLASSPATH o arquivo
CODEC_HOME/commons-codec-VERSAO.jar.
- 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.
- Obter uma instância do algoritmo de digest a ser utilizado:
MessageDigest md = MessageDigest.getInstance("MD5") ou
MessageDigest md = MessageDigest.getInstance("SHA-1")
- 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.
- Caso a entrada seja texto String, obter o array de bytes correspondente:
byte[] bytes = entrada.getBytes()
- Gerar o resumo:
byte[] digest = md.digest(bytes)
- Codificar o resumo para uma sequência de bytes contendo caracteres
hexadecimais, para saída legível:
byte[] digestHex = codec.encode(digest)
- 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
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
RecipeMessageDigest
public RecipeMessageDigest()
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