[android] Android下md5和服务器端加密出来不一致的问题

Android 4.0

 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("]");
    }
}