Android下md5和服务器端加密出来不一致的问题
问题:不同的编码方式,相同的明文,使用md5加密出来的密文不一样 分析:如果加密的明文是英文,那么使用gbk或者utf-8加密出来的密文都一样 如果是明文是中文,那么使用gbk和utf-8加密出来的密文不一样, 这是由于一个汉字,gbk用两个字节表示,utf-8用3个字节表示,所以加密出来的明文不一样 解决: ①将明文通过 md5Info.getBytes("utf-8")得到该明文的明文的byte数组(使用utf-8编码方式) ②再将该byte数组通过md5加密, 此时服务器和android端加密出来的密文一致 |
案例代码: package cn.zengfansheng.md5;
import org.apache.commons.codec.digest.DigestUtils;
public class Md5Test {
public static void main(String[] args) throws Exception {
// note********************* 1、********************
String timeStamp = "200911131015339";
String pass = "ab62a694d8bf6ced1fab6acd48d02f8";
String body = "<body><oelement><errorcode>0</errorcode><errormsg>操作成功</errormsg></oelement></body>";
String md5Info = timeStamp + pass + body;
printBytes(md5Info);// 默认utf-8
md5Info = DigestUtils.md5Hex(md5Info.getBytes("utf-8"));
String md5Hex = DigestUtils.md5Hex(md5Info);
System.out.println(md5Hex);// edfcb7ffd3e5ce7d49059d93fd8d070d
// note*********************2、汉字测试*********************
// 汉字的md5加密
// String name = "小胜";
//
// printBytes(name);
// // 默认:[-27-80-113-24-125-100]
//
// printBytes(name, "utf-8");
// // utf-8:[-27-80-113-24-125-100]
//
// printBytes(name, "gbk");
// // gbk:[-48-95-54-92]
//
// DigestUtils.md5Hex(name);
// System.out.println("utf-8,加密");
// 1、使用gbk编码:ead36ad8449b6e26e4951fe347de9357
// 2、使用utf-8编码:58fded57f6f33b37e5900762b96aa768
// 1、admin:utf-8编码加密后。md5:21232f297a57a5a743894a0e4a801fc3
// 2、admin:gbk编码md5加密后。md5:21232f297a57a5a743894a0e4a801fc3
// 总结:使用在使用md5加密字符串时
// 1、如果要加密的字符串全部是英文,那么使用utf-8和md5加密后出来的密文都一样
// 2、如果要加密的字符串包含有中文,那么utf-8和md5加密出来的密文不一致,因为一个汉字在gbk中占2个字节,而在utf-8中占用3个字节
}
/**
* 以默认的编码方式打印字符串的二进制码
*
* @param str
*/
public static void printBytes(String str) {
byte[] bytes = str.getBytes();
System.out.print("[");
for (byte b : bytes) {
System.out.print(b);
}
System.out.println("]");
}
/**
* 以charsetName的编码方式打印字符串的二进制码
*
* @param str
* @param charsetName
* @throws Exception
*/
public static void printBytes(String str, String charsetName) throws Exception {
byte[] bytes = str.getBytes(charsetName);
System.out.print("[");
for (byte b : bytes) {
System.out.print(b);
}
System.out.println("]");
}
} |
|