原文: https://howtodoinjava.com/java/io/how-to-generate-sha-or-md5-file-checksum-hash-in-java/

校验和哈希是对用户提供的内容应用某些算法和操作后获得的加密字符序列。 在本文中,我们将学习为文件生成校验和哈希。

1. 为什么我们可能要为文件生成校验和哈希?

任何严肃的文件提供者都提供一种机制,以使可下载文件具有校验和。 校验和是一种机制的形式,可确保正确下载我们下载的文件。 校验和就像文件有效性的证明一样,因此如果文件损坏,则该校验和将更改,因此,我们可以得知该文件不是同一文件,或者由于任何原因在传输之间文件都已损坏。

您还可以创建文件的校验和,以检测第三方对文件的任何可能更改,例如许可证文件。 您向客户端提供许可证,这些许可证可以上传到您的服务器。 您可以交叉验证文件的校验和以验证许可证文件在创建后未被修改。

阅读更多: MD5,SHA,PBKDF2,BCrypt 示例

2. 如何为文件生成校验和哈希

要为文件创建校验和,您将需要逐字节读取文件的内容。 然后使用以下方式为其生成哈希。

此函数有两个参数:

  1. 邮件摘要算法的实现
  2. 需要为其生成校验和的文件
  1. private static String getFileChecksum(MessageDigest digest, File file) throws IOException
  2. {
  3. //Get file input stream for reading the file content
  4. FileInputStream fis = new FileInputStream(file);
  5. //Create byte array to read data in chunks
  6. byte[] byteArray = new byte[1024];
  7. int bytesCount = 0;
  8. //Read file data and update in message digest
  9. while ((bytesCount = fis.read(byteArray)) != -1) {
  10. digest.update(byteArray, 0, bytesCount);
  11. };
  12. //close the stream; We don't need it now.
  13. fis.close();
  14. //Get the hash's bytes
  15. byte[] bytes = digest.digest();
  16. //This bytes[] has bytes in decimal format;
  17. //Convert it to hexadecimal format
  18. StringBuilder sb = new StringBuilder();
  19. for(int i=0; i< bytes.length ;i++)
  20. {
  21. sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
  22. }
  23. //return complete hash
  24. return sb.toString();
  25. }

您可以使用以下代码来生成 MD5 文件校验和

  1. //Create checksum for this file
  2. File file = new File("c:/temp/testOut.txt");
  3. //Use MD5 algorithm
  4. MessageDigest md5Digest = MessageDigest.getInstance("MD5");
  5. //Get the checksum
  6. String checksum = getFileChecksum(md5Digest, file);
  7. //see checksum
  8. System.out.println(checksum);

生成 SHA 文件校验和,请使用以下代码:

  1. //Use SHA-1 algorithm
  2. MessageDigest shaDigest = MessageDigest.getInstance("SHA-1");
  3. //SHA-1 checksum
  4. String shaChecksum = getFileChecksum(shaDigest, file);

如果需要更多说明,请给我评论。

学习愉快!