MD5即Message-Digest Algorithm 5(信息-摘要算法5),提供消息完整性保护的一种散列函数。它像人的指纹一样是唯一的 ,多用于用户登录密码存储以及校验文件在传输过程中是否被修改等。
经常在下载jar包的时候,后边会有一个MD5 的链接
点击MD5进去之后就是一个字符串: 6c10e15835ab214464228a9beb7afba8 *httpd-2.2.31.tar.bz2
在下载完之后可以通过查看文件的MD5值来判断是否被修改
原始数据通过MD5方式形成摘要之后想要找回数据是很困难的,所以安全性高,多数系统和项目在用,下边给出几种通过MD5生成摘要的方式:
package test;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
public class testMD5 {
private static String src="study MD5";
public static void main(String[] args) {
jdkMD5();
bcMD5();
ccMD5();
}
public static void jdkMD5(){
try {
MessageDigest md=MessageDigest.getInstance("MD5");
byte[] jdkMd5bytes=md.digest(src.getBytes());
//byte 数组转换成16进制
//方式一 :手动写转换16进制的方法
String dkMd5Str1=bytesToHex(jdkMd5bytes);
System.out.println("Java MD5:"+dkMd5Str1);
//引用第三方包 cc
String dkMd5Str2=Hex.encodeHexString(jdkMd5bytes);
System.out.println("Java MD5:"+dkMd5Str2);
String dkMd5Str3=bytes2HexString(jdkMd5bytes);
System.out.println("Java MD5:"+dkMd5Str3);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
/**
* 字节转换成16进制字符串方法一
* @param bytes
* @return
* */
public static String bytesToHex(byte[] bytes) {
StringBuffer md5str = new StringBuffer(); //把数组每一字节换成16进制连成md5字符串
int digital;
for (int i = 0; i < bytes.length; i++) {
digital = bytes[i];
if(digital < 0) {
digital += 256;
}
if(digital < 16){
md5str.append("0");
}
md5str.append(Integer.toHexString(digital));
}
return md5str.toString().toUpperCase();
}
/**
* 字节转换成16进制字符串方法二
* @param bytes
* @return
* */
public static String bytes2HexString(byte[] b) {
StringBuffer result = new StringBuffer();
String hex;
for (int i = 0; i < b.length; i++) {
hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
result.append(hex.toUpperCase());
}
return result.toString();
}
//BC 引入 bcprov-jdk15.jar
public static void bcMD5(){
Digest digest=new MD5Digest();
digest.update(src.getBytes(), 0,src.getBytes().length);
byte[] md5Bytes=new byte[digest.getDigestSize()];
digest.doFinal(md5Bytes, 0);
System.out.println("BC MD5:"+new String(org.bouncycastle.util.encoders.Hex.encode(md5Bytes)));
}
//CC 引用 commons-codec-1.5.jar
public static void ccMD5(){
System.out.println("CC MD5:"+DigestUtils.md5Hex(src.getBytes()));
}
}
输出结果:
Java MD5:4C6E2253053B1ED9E515EA0FA8F10439
Java MD5:4c6e2253053b1ed9e515ea0fa8f10439
Java MD5:4C6E2253053B1ED9E515EA0FA8F10439
BC MD5:4c6e2253053b1ed9e515ea0fa8f10439
CC MD5:4c6e2253053b1ed9e515ea0fa8f10439