【MD5加密】MD5加密编码的坑
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。
API验签
签名时,根据参数名称,将除签名(sign)外所有请求参数按照字母先后顺序排序: key + value .... key + value 。 注: 1、排序若首字母相同,则对第二个字母进行排序,以此类推。 2、value无需编码。 3、对于非必选参数,如果没有value值,也参与签名。(说明:非必选参数没有value值时,将参数名放到字符串中,即参数名要参加签名) 例如:将“foo=1,bar=2,baz=三”排序为“bar=2,baz=三,foo=1”参数名和参数值链接后,得到拼装字符串bar2baz三foo1。 4、在传入参数有数组时,比如 cartypelist [1,2] 则: 签名:cartypelist1,2
签名算法
将分配的得到的密钥(SecretKey)接到参数字符串尾部进行md5加密,再转化成大写,
格式是:md5(key1value1key2value2...Secret)。
由于在使用MD5加密的过程中发现两种加密算法生成的MD5值竟然不一样
算法一,推荐
public static string GetMd5String(string source) { MD5 mD = MD5.Create(); UTF8Encoding uTF8Encoding = new UTF8Encoding(); byte[] bytes = uTF8Encoding.GetBytes(source); byte[] array = mD.ComputeHash(bytes); StringBuilder stringBuilder = new StringBuilder(); byte[] array2 = array; for (int i = 0; i < array2.Length; i++) { byte b = array2[i]; stringBuilder.Append(b.ToString("x2")); } return stringBuilder.ToString(); }
算法二
/// <summary> /// 获得32位的MD5加密 /// </summary> /// <param name="input">输入字符串</param> /// <returns>返回值</returns> public static string GetMD532(string input) { MD5 md5 = MD5.Create(); byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(input)); var sb = new StringBuilder(); for (int i = 0; i < data.Length; i++) { sb.Append(data[i].ToString("x2")); } return sb.ToString(); }
由于编码不同,一个是UTF8编码,一个是默认编码,导致有汉字的时候,会产生不同的加密结果。
所以建议在有汉字的消息编码里对汉字进行Unincode编码,或者统一编码方法。