/// <summary> /// 使用UTF-8进行SHA256签名 /// 加盐&key={sign_key},若sign_key.IsNullOrWhiteSpace()则不加盐 /// </summary> /// <param name="content">签名原文</param> /// <param name="sign_key">签名密钥 为空则不加盐</param> /// <param name="format">大小写格式化 默认:FromatSign.UPPER</param> /// <returns></returns> public static string Sign(string content, string sign_key, FromatSign format = FromatSign.UPPER) { if (content.IsNullOrWhiteSpace()) { return(string.Empty); } if (!sign_key.IsNullOrWhiteSpace()) { content = $"{content}&key={sign_key}"; } var _format = format == FromatSign.UPPER ? "X2" /*大写*/ : "x2"; /*小写*/ var result = new StringBuilder(); using (var provider = new System.Security.Cryptography.SHA256CryptoServiceProvider()) { var byte_sign = provider.ComputeHash(Encoding.UTF8.GetBytes(content)); // 把二进制转化为十六进制 for (int i = 0; i < byte_sign.Length; i++) { result.Append(byte_sign[i].ToString(format: _format)); } } return(result.ToString()); }
/// <summary> /// 获取文件签名 /// </summary> /// <param name="type">默认:MD5</param> /// <param name="format">默认:UPPER</param> /// <returns></returns> public string GetCheckSum(string type = "MD5", FromatSign format = FromatSign.UPPER) { var CheckSum = string.Empty; if (!this.Exists) { return(CheckSum); } if (type.IsNullOrWhiteSpace() || "MD5".Equals(type, StringComparison.OrdinalIgnoreCase)) { using (var provider = new System.Security.Cryptography.MD5CryptoServiceProvider()) { try { var byte_sign = provider.ComputeHash(this.GetContent()); var result = new StringBuilder(); var _format = format == FromatSign.UPPER ? "X2" /*大写*/ : "x2"; /*小写*/ //for (int i = 0; i < byte_sign.Length; i++) //{ // var hex = byte_sign[i].ToString("X"); // if (hex.Length == 1) // { // result.Append("0"); // } // result.Append(hex); //} for (int i = 0; i < byte_sign.Length; i++) { result.Append(byte_sign[i].ToString(format: _format)); } CheckSum = result.ToString(); } catch (Exception ex) { throw new Exception("GetCheckSum fail,error:" + ex.Message); } } } return(CheckSum); }
/// <summary> /// 使用UTF-8进行MD5签名 /// 忽略参数中存的sign /// 最后{key} /// </summary> /// <param name="parameters"></param> /// <param name="key">签名密钥</param> /// <returns></returns> public static string Sign(IDictionary parameters, string key, FromatSign format = FromatSign.UPPER) { string str_sign = null; if (parameters != null && parameters.Count > 0) { Dictionary <string, string> parameters_temp = new Dictionary <string, string>(); foreach (DictionaryEntry item in parameters) { string val = (item.Value == null) ? string.Empty : item.Value.ToString(); parameters_temp.Add((string)item.Key, val); } str_sign = _Sign(parameters_temp, key, format); } return(str_sign); }
/// <summary> /// 使用UTF-8进行SHA256签名 /// 忽略参数中存的sign和value为空的键值对 /// 最后&key={key} /// </summary> /// <param name="parameters"></param> /// <param name="sign_key">签名密钥</param> /// <param name="format">大小写格式化 默认:FromatSign.UPPER</param> /// <returns></returns> public static string Sign(IDictionary parameters, string sign_key, FromatSign format = FromatSign.UPPER) { if (parameters == null || parameters.Count == 0) { return(string.Empty); } var parameters_filter = new Dictionary <string, string>(); foreach (DictionaryEntry item in parameters) { if (item.Key.IsNullOrWhiteSpace() || item.Value.IsNullOrWhiteSpace()) { continue; } parameters_filter.Add(item.Key.ToString(), item.Value.ToString()); } var str_sign = BuildSortString(parameters_filter, sign_key, format); return(str_sign); }
/// <summary> /// key排序+拼接 /// </summary> /// <param name="parameters"></param> /// <param name="sign_key">签名密钥</param> /// <param name="format">大小写格式化 默认:FromatSign.UPPER</param> /// <returns></returns> private static string BuildSortString(IDictionary <string, string> parameters, string sign_key, FromatSign format) { // 把字典按Key的字母顺序排序 var sortedParams = new SortedDictionary <string, string>(parameters); var query_string = new StringBuilder(); var dem = sortedParams.GetEnumerator(); while (dem.MoveNext()) { var key = dem.Current.Key; var value = dem.Current.Value; if ("SIGN".Equals(key, StringComparison.OrdinalIgnoreCase)) { continue; } query_string.Append("&").Append(key).Append("=").Append(value); } query_string.Append("&key=").Append(sign_key.ValueOrEmpty()); return(Sign(query_string.ToString().TrimStart('&'), null, format)); }
/// <summary> /// 给请求参数签名 /// </summary> /// <param name="parameters">所有字符型的请求参数,忽略参数中存的sign</param> /// <param name="key">签名密钥</param> /// <param name="qhs">是否前后都加密钥进行签名</param> /// <returns>签名</returns> private static string _Sign(IDictionary <string, string> parameters, string key, FromatSign format) { // 第一步:把字典按Key的字母顺序排序 IDictionary <string, string> sortedParams = new SortedDictionary <string, string>(parameters); IEnumerator <KeyValuePair <string, string> > dem = sortedParams.GetEnumerator(); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); while (dem.MoveNext()) { string _key = dem.Current.Key; string value = dem.Current.Value; if (!string.IsNullOrWhiteSpace(_key) && !string.IsNullOrWhiteSpace(value)) { //忽略sign参数 if (_key.Equals("sign", StringComparison.OrdinalIgnoreCase)) { continue; } query.Append("&").Append(_key).Append("=").Append(value); } } query.Append(key ?? string.Empty); StringBuilder result = new StringBuilder(); // 第三步:使用MD5加密 using (System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider()) //using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) { byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString().Trim('&'))); // 第四步:把二进制转化为大写的十六进制 for (int i = 0; i < bytes.Length; i++) { string hex = string.Empty; if (format == FromatSign.UPPER) { hex = bytes[i].ToString("X2"); //大写 } else { hex = bytes[i].ToString("x2"); //小写 } result.Append(hex); } } return(result.ToString()); }