# 在 Java 中生成 SHA 或 MD5 文件校验和哈希

> 原文： [https://howtodoinjava.com/java/io/how-to-generate-sha-or-md5-file-checksum-hash-in-java/](https://howtodoinjava.com/java/io/how-to-generate-sha-or-md5-file-checksum-hash-in-java/)

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

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

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

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

> **阅读更多： [MD5，SHA，PBKDF2，BCrypt 示例](https://howtodoinjava.com/security/how-to-generate-secure-password-hash-md5-sha-pbkdf2-bcrypt-examples/)**

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

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

此函数有两个参数：

1.  邮件摘要算法的实现
2.  需要为其生成校验和的文件

```java
private static String getFileChecksum(MessageDigest digest, File file) throws IOException
{
	//Get file input stream for reading the file content
	FileInputStream fis = new FileInputStream(file);

	//Create byte array to read data in chunks
	byte[] byteArray = new byte[1024];
	int bytesCount = 0; 

	//Read file data and update in message digest
	while ((bytesCount = fis.read(byteArray)) != -1) {
		digest.update(byteArray, 0, bytesCount);
	};

	//close the stream; We don't need it now.
	fis.close();

	//Get the hash's bytes
	byte[] bytes = digest.digest();

	//This bytes[] has bytes in decimal format;
	//Convert it to hexadecimal format
	StringBuilder sb = new StringBuilder();
	for(int i=0; i< bytes.length ;i++)
	{
		sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
	}

	//return complete hash
   return sb.toString();
}

```

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

```java
//Create checksum for this file
File file = new File("c:/temp/testOut.txt");

//Use MD5 algorithm
MessageDigest md5Digest = MessageDigest.getInstance("MD5");

//Get the checksum
String checksum = getFileChecksum(md5Digest, file);

//see checksum
System.out.println(checksum);

```

要**生成 SHA 文件校验和**，请使用以下代码：

```java
//Use SHA-1 algorithm
MessageDigest shaDigest = MessageDigest.getInstance("SHA-1");

//SHA-1 checksum 
String shaChecksum = getFileChecksum(shaDigest, file);

```

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

学习愉快！