Hashing MD5 em Java

Hashing MD5 em Java

1. Visão geral

MD5 é uma função hash criptográfica amplamente usada, que produz um hash de 128 bits.

Neste artigo, veremos como veremos as diferentes abordagens decreate MD5 hashes using various Java libraries.

2. MD5 usando classeMessageDigest

Temos uma funcionalidade de hashing na classejava.security.MessageDigest. A ideia é primeiro instanciarMessageDigest com o tipo de algoritmo que você deseja usar como argumento para o Singleton:

MessageDigest.getInstance(String Algorithm)

Em seguida, continue atualizando o resumo da mensagem usando a funçãoupdate():

public void update(byte [] input)

A função acima pode ser chamada várias vezes quando se diz que você está lendo um arquivo longo. Finalmente, precisamos usar a função digest para gerar um código hash:

public byte[] digest()

Abaixo está um exemplo que gera hash para uma senha e depois a verifica:

@Test
public void givenPassword_whenHashing_thenVerifying()
  throws NoSuchAlgorithmException {
    String hash = "35454B055CC325EA1AF2126E27707052";
    String password = "ILoveJava";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(password.getBytes());
    byte[] digest = md.digest();
    String myHash = DatatypeConverter
      .printHexBinary(digest).toUpperCase();

    assertThat(myHash.equals(hash)).isTrue();
}

Da mesma forma, também podemos verificar a soma de verificação de um arquivo:

@Test
public void givenFile_generatingChecksum_thenVerifying()
  throws NoSuchAlgorithmException, IOException {
    String filename = "src/test/resources/test_md5.txt";
    String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(Files.readAllBytes(Paths.get(filename)));
    byte[] digest = md.digest();
    String myChecksum = DatatypeConverter
      .printHexBinary(digest).toUpperCase();

    assertThat(myChecksum.equals(checksum)).isTrue();
}

3. md5 usando Apache Commons

A classeorg.apache.commons.codec.digest.DigestUtils torna as coisas muito mais simples para as operações acima que fizemos usando a classeMessageDigest.

Vamos ver um exemplo de hash e verificação de senha:

@Test
public void givenPassword_whenHashingUsingCommons_thenVerifying()  {
    String hash = "35454B055CC325EA1AF2126E27707052";
    String password = "ILoveJava";

    String md5Hex = DigestUtils
      .md5Hex(password).toUpperCase();

    assertThat(md5Hex.equals(hash)).isTrue();
}

4. md5 usando Guava

Abaixo está outra abordagem mais simples para gerar somas de verificação MD5 usandocom.google.common.io.Files.hash:

@Test
public void givenFile_whenChecksumUsingGuava_thenVerifying()
  throws IOException {
    String filename = "src/test/resources/test_md5.txt";
    String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3";

    HashCode hash = com.google.common.io.Files
      .hash(new File(filename), Hashing.md5());
    String myChecksum = hash.toString()
      .toUpperCase();

    assertThat(myChecksum.equals(checksum)).isTrue();
}

5. Conclusão

Existem diferentes abordagens na API Java e em outras APIs de terceiros, como Apache commons e Guava. Escolha sabiamente com base nos requisitos do projeto e nas dependências que seu projeto possa querer seguir.

Como sempre, o código está disponívelover on Github.