在一些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;
}