消息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。 消息摘要可以用于判断两个文件是否一样,或者将明文密码加密成暗文,而且是无法解密的,有人说可以解密其实是将各种字符串的消息摘要存在Map中以消息摘要为键,字符串为值,当获取一个消息摘要是查询Map就可以了,对于这种情况我们可以在消息摘要的后面添加一个盐(就是在原字符串后面添加一个随意的字符串),以防止被人获取到真正的消息摘要。那么如何获取消息摘要呢,对于文件可以将消息摘要流套在文件的输入流,也可以套在文件输出流,当文件输入或输出完成后就可以获取该文件的消息摘要要了。
public static byte[] getMd5(String file) throws NoSuchAlgorithmException, IOException{
MessageDigest md5=MessageDigest.getInstance("MD5");
InputStream in=new DigestInputStream(
new BufferedInputStream(new FileInputStream(file)),md5
);
byte[]buffer=new byte[2*1024];
int b=-1;
while((b=in.read(buffer))!=-1);
in.close();
//获取消息摘要
return md5.digest();
}
MessageDigest 类为应用程序提供消息摘要算法的功能,如 MD5 或 SHA 算法。下载工具在下载文件是先下载该文件的消息摘要,下载玩文件后生成一个消息摘要,看两个消息摘要是否一样,若一样说明文件正确下载了,消息摘要不一样说明文件下载错误。
/**
* 获取一个字符串的消息摘要,可以应用到给密码加密,这个过程是单向的
* @param str 被加密的字符串
* @param salt
* @return
*/
public static byte[] getMd5(String str,String salt){
if(str==null){
throw new IllegalArgumentException("非法参数");
}
String s=salt==null?str:str+salt;
try {
byte[] data=s.getBytes("utf-8");//将字符串转化为utf-8编码的字节数组
MessageDigest md5=MessageDigest.getInstance("MD5");
md5.update(data);//提交数据
//获取消息摘要
return md5.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException("没有该加密类型");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException("编码错误");
}
}