在一些api中会使用到一些方法签名,签名的生成经常采用api中的参数进行加密生成签名,要想加密参数,必须对参数进行一个排序才能在另一端正确的加密进行对比才能验证通过,现在写一个对参数进行排序的方法,这里使用的升序排列,当然也可以按照降序排列,然后把所有参数进行MD5加密生成一个散列值,当然加密的话不一定适用MD5加密,也可以使用其他方法对参数进行加密生成签名
此方法使用post提交时使用起来比较方便
/// <summary>
/// 获取签名 按照参数排序然后拼接上key之后用MD5加密作为签名
/// </summary>
/// <param name="parms">参数集合</param>
/// <param name="key">秘钥</param>
/// <returns></returns>
public static string GetSign(Dictionary<string,string> parms,string key="")
{
string sign = "";
List<string> parmkeys = parms.OrderBy(s => s.Key).ThenBy(s => s.Value).Select(s => s.Key.ToLower() + "=" + s.Value).ToList();
string parm_get = string.Join("&",parmkeys);
sign = MD5.GetMD5(parm_get+key);
return sign;
}
此方法使用get提交时用起来比较方便:
/// <summary>
/// 获取签名 按照参数排序然后拼接上key之后用MD5加密作为签名
/// </summary>
/// <param name="parms">get请求时拼接的参数字符串</param>
/// <param name="key">秘钥</param>
/// <returns></returns>
public static string GetSign(string parms, string key="")
{
string sign = "";
string[] arr = parms.TrimStart('?').Split('&');
Dictionary<string, string> parmDic = new Dictionary<string, string>();
if (arr!=null&&arr.Length>0)
{
foreach (var item in arr)
{
if (item.Split('=')[0].Trim()!="")
{
parmDic.Add(item.Split('=')[0], item.Split('=').Length > 1 ? item.Split('=')[1] : "");
}
}
}
List<string> parmKeys = parmDic.OrderBy(s => s.Key).ThenBy(s => s.Value).Select(s => s.Key.ToLower() + "=" + s.Value).ToList();
string parm_get = string.Join("&", parmKeys);
sign = MD5.GetMD5(parm_get+key);
return sign;
}