MessageDigest获取字符串或文件MD5详解

来源:互联网 发布:人工智能剧情结局 编辑:程序博客网 时间:2024/06/07 08:08

MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。

MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
可以用于
加密密码。
数据校验。例:下载文件时保证文件的完整性。


public static String InputStreamMd5(InputStream is){String md5 ="";try {MessageDigest ms = MessageDigest.getInstance("MD5");byte[] bytes = new byte[1024*3];int read = 0;try {while((read = is.read(bytes)) !=-1){ms.update(bytes, 0, read);}//拿到结果byte[] result = ms.digest();StringBuilder sb = new StringBuilder();//默认为16//StringBuilder sb = new StringBuilder(32);//初始容量设置为32//// 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去for(byte b : result){sb.append(hexDigits[b>>>4 & 0xf]);sb.append(hexDigits[b&0xf]);}md5 = sb.toString();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}return md5;}
public static String StringMd5(String input){byte[] result = null;try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] inputByteArray = input.getBytes();md.update(inputByteArray); result = md.digest(inputByteArray);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}return byteArrayToHex(result);}/** * 字节数组转16进制字符串 * @param byteArray * @return */public static String byteArrayToHex(byte[] byteArray){char[] hexDigits = "0123456789abcdef".toCharArray();char[] resultCharArray =new char[byteArray.length * 2];int index = 0;  for (byte b : byteArray) {     resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];     resultCharArray[index++] = hexDigits[b& 0xf];  }return new String(resultCharArray);}





0 0