MD5算法最初是由麻省理工实验室和RSA机构发明的,其发展历程是由MD2,MD3,MD4传承而来。
MD5算法是一种非对称算法,即无法通过密文(加密后的数据)得到相应的明文(原始数据),它通过数学原理,将任意长度的字符串,变换成一个128位的整数,因此在签名和校验领域用途广泛。
应用场景:针对文件,在传输过程由于网络原因丢帧或者被人别恶意篡改内容,可以通过源文件的MD5和下载后的文件MD5值进行比较,如果一致说明文件内容相同,否则下载的文件有问题。
1、既然MD5这么好,那就一起看看其代码实现
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Util {
/**
* 一次性处理的文件字节数
*/
private static final int ONE_HANDLE_FILE_BYTE_COUNT = 8192;
/**
* MD5 算法
*/
private static final String MD5_ALGORITHM = "MD5";
/**
* 无数据的索引值
*/
private static final int NOT_DATA_INDEX = -1;
/**
* 正数符号
*/
private static final int POSITIVE_SIGN = 1;
/**
* 十六进制
*/
private static final int HEXADECIMAL = 16;
/**
* 生成文件内容的 MD5 值
*
* @param file
* @return
*/
public static String generateMD5(File file) {
if (!file.isFile())//不是文件
return null;
MessageDigest digest;
FileInputStream in = null;
byte buffer[] = new byte[ONE_HANDLE_FILE_BYTE_COUNT];
int len;
try {
digest = MessageDigest.getInstance(MD5_ALGORITHM);
in = new FileInputStream(file);
while ((len = in.read(buffer)) != NOT_DATA_INDEX) {
digest.update(buffer, 0, len);
}
BigInteger bigInteger = new BigInteger(POSITIVE_SIGN, digest.digest());
return bigInteger.toString(HEXADECIMAL);
} catch (NoSuchAlgorithmException e) {
//logger.error(" 生成文件内容的 MD5", e);
e.printStackTrace();
return null;
} catch (FileNotFoundException e) {
//logger.error(" 生成文件内容的 MD5", e);
e.printStackTrace();
return null;
} catch (IOException e) {
// logger.error(" 生成文件内容的 MD5", e);
e.printStackTrace();
return null;
} finally {
try {
in.close();
} catch (Exception e) {
e.printStackTrace();
// logger.error("关闭文件", e);
}
}
}
public static void main (String[]args){
String md5 = MD5Util.generateMD5( new File("D:\\ip_20180823102738.txt"));
System.out.println(md5);
}
}
2、测试结果
3、是不是觉得太麻烦了? 接着看DigestUtils工具类的使用
public static void main (String[]args){
String md5 = MD5Util.generateMD5( new File("D:\\test.txt"));
System.out.println(md5);
System.out.println("########################");
InputStream is = new FileInputStream(new File("D:\\test.txt"));
String md5Hex = DigestUtils.md5DigestAsHex(is);
System.out.println(md5Hex);
}
4、测试结果
赶紧转发+收藏吧,工作中总会有用。
本文暂时没有评论,来添加一个吧(●'◡'●)