Java IO 之 生成SHA或MD5文件校验和哈希

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

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

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

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

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

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

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

此函数有两个参数:

  1. 消息摘要算法的实现
  2. 需要为其生成校验和的文件
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文件校验和

//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文件校验和,请使用以下功能:

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

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

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

saigon has written 1445 articles

One thought on “Java IO 之 生成SHA或MD5文件校验和哈希

Leave a Reply