MD5加密结果不一致

关于java C# MD5加密结果方不一致问题

MD5加密得到的结果一般是16位或者32位,不管是什么语言MD5加密都是一样的(除非更改了加密算法)

例如,当C# java MD5加密方不一致的时候

  1. 确定两边的编码是否一致
    java MD5加密
  public static String getMd5(String passord) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        StringBuilder pwd = new StringBuilder("");

        MessageDigest md = MessageDigest.getInstance("MD5");// 生成一个MD5加密计算摘要
        byte[] digest1 = md.digest(passord.getBytes("UTF-16LE"));
//        byte[] digest1 = passord.getBytes("UTF-16LE");
        for (int i = 0; i < digest1.length; i++)
        {
            //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
//            pwd = pwd + digest1[i].toString("x");
            int v = digest1[i] & 0xFf;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                pwd.append(0);
            }
            pwd.append(hv);
        }
//        MD5 md5 = new MD5CryptoServiceProvider();
        return pwd.toString();
    }
	C# MD5加密
public string Encrypt(string src)
    {

        string pwd = "";
        //pwd = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(src, "md5");
        MD5 md5 = MD5.Create();
        //加密后是一个字节类型的数组
        byte[] s = md5.ComputeHash(Encoding.Unicode.GetBytes(src));
        //通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
        for (int i = 0; i < s.Length; i++)
        {
            //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
            pwd = pwd + s[i].ToString("x");
        }
        return pwd;
    }

分别对java加密123456,和C#加密123456

java得到结果 32位
5fa285e1bebe0a6623e33afc04a1fbd5

C#得到结果 30位
5fa285e1bebea6623e33afc4a1fbd5

两边用到的加密都是Unicode编码,为什么java加密比C#加密多了两个0

因为之前那个项目是用C#进行md5加密的,我用java进行md5加密发现得到的结果不一样
问题如下

public static String getMd5(String passord) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        StringBuilder pwd = new StringBuilder("");

        MessageDigest md = MessageDigest.getInstance("MD5");// 生成一个MD5加密计算摘要
        byte[] digest1 = md.digest(passord.getBytes("UTF-16LE"));
//        byte[] digest1 = passord.getBytes("UTF-16LE");
        for (int i = 0; i < digest1.length; i++)
        {
            //将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
//            pwd = pwd + digest1[i].toString("x");
            int v = digest1[i] & 0xFf;
            String hv = Integer.toHexString(v);
            if (hv.length() < 1) {
                pwd.append(0);
            }
            pwd.append(hv);
        }
//        MD5 md5 = new MD5CryptoServiceProvider();
        return pwd.toString();
    }

if (hv.length() < 2) {
pwd.append(0);
}
改为
if (hv.length() < 1) {
pwd.append(0);
}

下面分享下java和C#两边的编码对应

javaC#
US-ASCIIASCII
ISO-8859-1ISO-8859-1
UTF-8UTF-8
UTF-16BEBigEndianUnicode
UTF-16LEUnicode