平时在网上下载文件时,有时会看到一个不规律的字符串(MD5:609ff6b4db5c8dcb85728459705f4df4)。可以通过如下方法验证下载的文件是否未被修改过。
import java.io.File;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.Assert;
import org.junit.Test;
/**
* 下载的文件为 mysql-essential-5.1.46-win32.msi
* MD5值为 609ff6b4db5c8dcb85728459705f4df4
*/
public class MD5Test {
/**
* 使用Java API实现
* @throws Exception
*/
@Test
public void testByMessageDigest() throws Exception {
// 构建文件输入流
FileInputStream fis = new FileInputStream(new File("D:\\mysql-essential-5.1.46-win32.msi"));
// 初始化MessageDigest,并指定MD5算法
DigestInputStream dis = new DigestInputStream(fis, MessageDigest.getInstance("MD5"));
// 缓冲字节数组
byte[] buffer = new byte[1024];
// 当读到值大于-1就继续读
int read = dis.read(buffer, 0, 1024);
while (read > -1) {
read = dis.read(buffer, 0, 1024);
}
// 关闭流
dis.close();
// 获得MessageDigest
MessageDigest md = dis.getMessageDigest();
// 摘要处理
byte[] b = md.digest();
// 十六进制转换
String md5hex = Hex.encodeHexString(b);
// 验证
Assert.assertEquals(md5hex, "609ff6b4db5c8dcb85728459705f4df4");
}
/**
* 使用Commons Codec实现
* @throws Exception
*/
@Test
public void testByDigestUtils() throws Exception {
// 构建文件输入流
FileInputStream fis = new FileInputStream(new File("D:\\mysql-essential-5.1.46-win32.msi"));
// 使用DigestUtils做MD5Hex处理
String md5hex = DigestUtils.md5Hex(fis);
// 关闭流
fis.close();
// 验证
Assert.assertEquals(md5hex, "609ff6b4db5c8dcb85728459705f4df4");
}
}