Criptografia Java - Message Digest

As funções de hash são extremamente úteis e aparecem em quase todos os aplicativos de segurança da informação.

Uma função hash é uma função matemática que converte um valor de entrada numérico em outro valor numérico compactado. A entrada para a função hash é de comprimento arbitrário, mas a saída é sempre de comprimento fixo.

Os valores retornados por uma função hash são chamados message digest ou simplesmente hash values. A seguinte imagem ilustrou a função hash.

Java fornece uma classe chamada MessageDigestque pertence ao pacote java.security. Esta classe suporta algoritmos como SHA-1, SHA 256, algoritmos MD5 para converter uma mensagem de comprimento arbitrário em um resumo de mensagem.

Para converter uma determinada mensagem em um resumo da mensagem, siga as etapas abaixo -

Etapa 1: Criar um objeto MessageDigest

A classe MessageDigest fornece um método chamado getInstance(). Este método aceita uma variável String especificando o nome do algoritmo a ser usado e retorna um objeto MessageDigest implementando o algoritmo especificado.

Crie o objeto MessageDigest usando o getInstance() método conforme mostrado abaixo.

MessageDigest md = MessageDigest.getInstance("SHA-256");

Etapa 2: passe os dados para o objeto MessageDigest criado

Depois de criar o objeto de resumo da mensagem, você precisa passar a mensagem / dados para ele. Você pode fazer isso usando oupdate() método do MessageDigest , este método aceita uma matriz de bytes que representa a mensagem e a adiciona / passa para o objeto MessageDigest criado acima.

md.update(msg.getBytes());

Etapa 3: gerar o resumo da mensagem

Você pode gerar o resumo da mensagem usando o digest() método da classe MessageDigest esse método calcula a função hash no objeto atual e retorna o resumo da mensagem na forma de uma matriz de bytes.

Gere o resumo da mensagem usando o método digest.

byte[] digest = md.digest();

Exemplo

A seguir está um exemplo que lê dados de um arquivo e gera um resumo da mensagem e o imprime.

import java.security.MessageDigest;
import java.util.Scanner;

public class MessageDigestExample {
   public static void main(String args[]) throws Exception{
      //Reading data from user
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter the message");
      String message = sc.nextLine();
	  
      //Creating the MessageDigest object  
      MessageDigest md = MessageDigest.getInstance("SHA-256");

      //Passing data to the created MessageDigest Object
      md.update(message.getBytes());
      
      //Compute the message digest
      byte[] digest = md.digest();      
      System.out.println(digest);  
     
      //Converting the byte array in to HexString format
      StringBuffer hexString = new StringBuffer();
      
      for (int i = 0;i<digest.length;i++) {
         hexString.append(Integer.toHexString(0xFF & digest[i]));
      }
      System.out.println("Hex format : " + hexString.toString());     
   }
}

Resultado

O programa acima gera a seguinte saída -

Enter the message
Hello how are you
[[email protected]
Hex format: 2953d33828c395aebe8225236ba4e23fa75e6f13bd881b9056a3295cbd64d3