Início > Programação, Segurança > Como Gerar o Checksum de um Arquivo

Como Gerar o Checksum de um Arquivo

Como expliquei no artigo Criptografia de Senha em Java, uma função de hash gera uma cadeia de caracteres de tamanho fixo a partir de uma sequência de qualquer tamanho; é uma equação matemática que a partir de um texto cria um código chamado message digest (resumo de mensagem), que é o resultado retornado por uma função de hash. Este pode ser comparado a uma impressão digital, pois cada documento possui um valor único de resumo e até mesmo uma pequena alteração no documento, como a inserção de um espaço em branco, resulta em um resumo completamente diferente.

Naquele artigo, mostrei como criptografar um texto utilizando o SHA-256, que é a variante mais utilizada do SHA-2. O código abaixo utiliza outros algoritmos (ou funções hash) para gerar o message digest do conteúdo de um arquivo qualquer. Quando esse resultado é utilizado para checar se um arquivo é genuíno e isento de erros, ele passa a ser chamado de hash sum ou mais popularmente de checksum:

public static void main(String[] args) throws Exception {
   byte[] fileBytes = Files.readAllBytes(Paths.get("/path/my_file.war"));
   Arrays.asList("MD5", "SHA-1", "SHA-256", "SHA-512").forEach((alg) -> {
      try {
         MessageDigest algoritmo = MessageDigest.getInstance(alg);
         byte digestMessage[] = algoritmo.digest(fileBytes);
         System.out.println(alg);
         System.out.println(new HexBinaryAdapter().marshal(digestMessage));
      } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
      }
   });
}

Utilizei o HexBinaryAdapter do Java, mas você poderia utilizar o Hex.encodeHexString(…) do Apache Commons ou ainda poderia converter os bytes para a versão hexadecimal manualmente byte-a-byte, assim:

(...)
StringBuilder hexPassword = new StringBuilder();
for (byte aByte : digestMessage) {
   hexPassword.append(String.format("%02X", 0xFF & aByte));
}
System.out.println(hexPassword.toString());

Alternativas

Se você só precisa do checksum e estiver utilizando Windows, você poderia baixar o FCIV da Microsoft, que pelo menos é um utilitário de linha de comando, ou o Hash Calculator, que mostra os checksums de forma gráfica. O FCIV é bem simples de utilizar:

C:\>fciv -SHA1 {ARQUIVO}

Referências

1. [http://howtodoinjava.com/core-java/io/how-to-read-file-content-into-byte-array-in-java/]
2. [http://www.adam-bien.com/roller/abien/entry/java_8_reading_a_file]
3. [http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest]
4. [http://www.devmedia.com.br/como-funciona-a-criptografia-hash-em-java/31139]
5. [https://www.lifewire.com/what-does-checksum-mean-2625825]

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: