您的位置:首页 > 其它

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

2016-11-27 20:53 375 查看
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 block
e.printStackTrace();
}

} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.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 block
e.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);
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: