您的位置:首页 > 编程语言 > Java开发

MD5加密的真正字符串 和16进制构建的字符串 区别

2010-09-08 10:35 267 查看
这两天做项目一直在被这个问题烦恼

 

我们的md5验证字符串 和合作方接口提供的字符串不一致。原因不明。

 

问了下朋友,他说不通语言对中文的加密结果不一致。

 

我挺郁闷 我用的是c#,对方使用java。 最后还是群里的一个朋友说明了真相。

 

真相就是 什么语言对md5的加密结果都一致,MD5算法都是一致的。只是有的是真的md5,有的是16进制的md5。

 

还给出了代码 在此不敢独享,给以后遇到这样问题的朋友们提供参考。

 

首先看下我们的加密

 

C#:这是真的md5字符串

public string md5(string str)
{
MD5 m = new MD5CryptoServiceProvider();
byte[] s = m.ComputeHash(UnicodeEncoding.UTF8.GetBytes(str));
return BitConverter.ToString(s);
}


对方的java版本:16进制后的字符串(假的MD5)

public class mdencode {
public mdencode() {
}

public String testDigest(String myinfo) {
byte[] digesta = null;
try {
java.security.MessageDigest alga = java.security.MessageDigest.
getInstance("MD5");
alga.update(myinfo.getBytes());
digesta = alga.digest();

}
catch (java.security.NoSuchAlgorithmException ex) {
System.out.println("非法摘要算法");
}
return this.byte2hex(digesta);
}

public String byte2hex(byte[] b) { //二行制转字符串
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b
& 0XFF));
if (stmp.length() == 1) {
hs = hs + "0" + stmp;
} else {
hs = hs + stmp;
}
if (n < b.length - 1) {
hs = hs;
}
}
return hs;
}

}


 

和对方对接写的方法:16进制后的字符串(加的MD5)

/// <summary>
/// 加密
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
private string getMd5Hash(byte[] bytes)
{
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(bytes);
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}


 

 

到此 大功告成。。。

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