Md5加密中 C#和Java得到的加密结果不同 本帖最后由 keita90 于 2011-08-12 10:28:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Java的源代码错误如下:dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s"; string dataToHash = String.Format(dataFormatString, ...); 应该是%12$s,寫錯了。 java写的,注意字符串编码方式,java和c#的要一样,不然结果不一样 public static void main(String[] args) throws Exception { System.out.println(getMD5("a", "utf-8")); } public static String getMD5(String str, String encoding) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes(encoding)); byte[] result = md.digest(); StringBuffer sb = new StringBuffer(32); for (int i = 0; i < result.length; i++) { int val = result[i] & 0xff; if (val < 0xf) { sb.append("0"); } sb.append(Integer.toHexString(val)); } return sb.toString().toUpperCase(); } a的md5值为0CC175B9C0F1B6A831C399E269772661 能否测一下123456的值是否为ce0bfd15059b68d67688884d7a3d3e8c 123456 的md5 为 e10adc3949ba59abbe56e057f20f883e 是滴,在涉及到非ASCII字符时,编码显得尤为重要 = =各位大侠 我需要得到ce0bfd15059b68d67688884d7a3d3e8c 这个结果 谢谢 楼主试试这样写MD5 md5 = new MD5CryptoServiceProvider(); byte[] fromData = System.Text.Encoding.Default.GetBytes(myString); byte[] targetData = md5.ComputeHash(fromData);上面用defalut的话,可以与java等其他语言的md5结果一致 各位大侠 我现在想要修改的是Java代码 .net+sqlserver数据库的值是不能改变的 查了下c#的api ,System.Text.UnicodeEncoding.Unicode.GetBytes(s)用的是utf-16 little-endian编码方式,用下面的代码就可以了 public static void main(String[] args) throws Exception { System.out.println(getMD5("123456", "UTF-16LE")); } public static String getMD5(String str, String encoding) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes(encoding)); byte[] result = md.digest(); StringBuffer sb = new StringBuffer(32); for (int i = 0; i < result.length; i++) { int val = result[i] & 0xff; if (val < 0xf) { sb.append("0"); } sb.append(Integer.toHexString(val)); } return sb.toString().toUpperCase(); } 重要的是编码方式选 UTF-16LE 这个 在输入“123456”时java和C#的inputPasswordBytes都为{49,0,50,0,51,0,52,0,53,0,54,0}编码改成UTF-16LE的确是对的但是经过MD5加密之后,byte[] hash却不同:Java [-50, 11, -3, 21, 5, -101, 104, -42, 118, -120, -120, 77, 122, 61, 62, -116]C# [206, 11, 253,21, 5, 155, 104, 214, 118, 136, 136, 77, 122, 61, 62, 140]好像已经接近正确了。。不知道怎么改 C#的byte的范围和java的不一样。。 顶lslz可以到网上找找有没有C#版的md5加密,再找个java版的md5加密, 把java里的byte & 255就能得到c#里面的那个值了java跟C#的数据类型不一样的byte b = -50;int c = b & 255; System.out.println(c); java的byte是有符号的,c#的是无符号的。 嘿嘿又查了下apisbyte是有符号类型的,可以跟java的通用 java和C#的md5确实是不一样的,java的需要补位就和C#的一样了 请求服务端,返回Json数据后是乱码 那位高手帮我看下这个问题Cannot convert value of type [] to required type [] for property 'ba javaBean封装获取时间,怎么弄啊?!! java如何将excel文件导入到access中 求记录用户在页面停留时间的方法 tomcat内存溢出,大家帮帮忙 struts-config.xml报这种错误,如何解决 急聘:Java软件工程师 用java or jsp怎么写这个sql? 斑竹在吗?????help me !! cas报错,请帮忙 如何找出应用程序的死循环以及耗费资源的sql
如下:dataFormatString = "%1$s, %2$s, %3$s, %4$s, %5$s, %6$s, %7$s, %8$s, %9$s, %10$s, %11$s, %12s"; string dataToHash = String.Format(dataFormatString, ...); 应该是%12$s,寫錯了。
System.out.println(getMD5("a", "utf-8"));
} public static String getMD5(String str, String encoding) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(encoding));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i < result.length; i++) {
int val = result[i] & 0xff;
if (val < 0xf) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString().toUpperCase();
}
能否测一下123456的值是否为ce0bfd15059b68d67688884d7a3d3e8c
e10adc3949ba59abbe56e057f20f883e
MD5 md5 = new MD5CryptoServiceProvider();
byte[] fromData = System.Text.Encoding.Default.GetBytes(myString);
byte[] targetData = md5.ComputeHash(fromData);上面用defalut的话,可以与java等其他语言的md5结果一致
public static void main(String[] args) throws Exception {
System.out.println(getMD5("123456", "UTF-16LE"));
} public static String getMD5(String str, String encoding) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(encoding));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i < result.length; i++) {
int val = result[i] & 0xff;
if (val < 0xf) {
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
return sb.toString().toUpperCase();
}
编码改成UTF-16LE的确是对的但是经过MD5加密之后,byte[] hash却不同:
Java [-50, 11, -3, 21, 5, -101, 104, -42, 118, -120, -120, 77, 122, 61, 62, -116]
C# [206, 11, 253,21, 5, 155, 104, 214, 118, 136, 136, 77, 122, 61, 62, 140]
好像已经接近正确了。。不知道怎么改
顶lslz可以到网上找找有没有C#版的md5加密,再找个java版的md5加密,
java跟C#的数据类型不一样的byte b = -50;
int c = b & 255;
System.out.println(c);