C# MD5加密以及MD5少位数和MD5不匹配的问题
前言
最近接入了微信支付,发现经常会出现sign签名错误,概率性出现,一直没找到原因。
后面才发现我从网上找来的MD5加密函数会出现少0的问题,从而导致加密出来的md5码可能是31位或者30位的问题
加密方法
/// <summary> /// MD5 32位加密 /// </summary> /// <param name="str"></param> /// <returns></returns> static string Md5(string str) { string cl = str; string pwd = ""; System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();//实例化一个md5对像 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 byte[] s = md5.ComputeHash(Encoding.ASCII.GetBytes(cl)); // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得 for (int i = 0; i < s.Length; i++) { // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符 pwd = pwd + s[i].ToString("X2"); } return pwd; }
如上就是我最终的MD5加密方法
FAQ
- MD5少位数是因为s[i]是一个byte,8位,当s[i]中的值为0时,生成的字符串应该是00,而如果ToString("X")会生成0,所以有几个s[i]为0,就少了多少位.把"X"改成"X2"就可以了
- MD5码加密和其他地方不一样的问题。是因为获取bytes时的编码问题,注意下编码就可以了。Encoding.ASCII/Encoding.UTF8