MD5是属于摘要加密,不可逆
签名过程:
1. 将参数按key排序,完后收尾(用 &)链接,形成类似 a=1&b=2&c=3 的字符串 preStr
2. 用签名秘钥 signKey 对以上字符串
preStr
做签名,生成 签名 sign
3. 将 sign 以及它的值 合并到请求的参数中,想服务器做请求
验签过程:
1. 将接收到的参数出去sign外首尾相连,形成
a=1&b=2&c=3 的字符串 preStr
2.
用签名秘钥 signKey 对以上字符串
preStr
做签名,生成 签名 sign2
3. 对比参数中sign和sign2是否相等
代码如下:
/// <summary> /// <![CDATA[把数组所有元素,按照“参数=参数值”的模式用&字符拼接成字符串 "" 和 null 值 去除]]> /// </summary> /// <param name="dicArray">需要拼接的数组</param> /// <returns>拼接完成以后的字符串</returns> public static string BuildPreSingString(SortedDictionary<string, string> dicArray) { var prestr = new StringBuilder(); foreach (KeyValuePair<string, string> temp in dicArray) { if (temp.Key != "sign" && temp.Value != "" && temp.Value != null) { prestr.Append(temp.Key + "=" + temp.Value + "&"); } } //去掉最後一個&字符 int nLen = prestr.Length; prestr.Remove(nLen - 1, 1); return prestr.ToString(); } /// <summary> /// MD5签名 /// </summary> /// <param name="prestr">待签名字符串</param> /// <param name="key">密钥</param> /// <param name="charset">编码</param> /// <returns>签名</returns> public static string Sign(string prestr, string key, string charset = "utf-8") { prestr = prestr + "&key=" + key; var sb = new StringBuilder(32); MD5 md5 = new MD5CryptoServiceProvider(); var arr = md5.ComputeHash(Encoding.GetEncoding(charset).GetBytes(prestr)); foreach (var b in arr) { sb.Append(b.ToString("x").PadLeft(2, '0')); } return sb.ToString(); }