Beispiel #1
0
        /// <summary>
        /// 使用UTF-8进行MD5签名
        /// 忽略参数中存的_queue_sign和value为空的键值对
        /// 最后&key={key}
        /// </summary>
        /// <param name="parameters"></param>
        /// <param name="key">签名密钥</param>
        /// <returns></returns>
        public static string Sign(IDictionary parameters, string key, MD5_Format format = MD5_Format.UPPER)
        {
            string str_sign = string.Empty;

            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);
        }
Beispiel #2
0
        /// <summary>
        /// 给请求参数签名
        /// </summary>
        /// <param name="parameters">所有字符型的请求参数,忽略参数中存的_queue_sign</param>
        /// <param name="key">签名密钥</param>
        /// <param name="qhs">是否前后都加密钥进行签名</param>
        /// <returns>签名</returns>
        private static string _Sign(IDictionary <string, string> parameters, string key, MD5_Format 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))
                {
                    //忽略_queue_sign参数
                    if (_key.Equals("_queue_sign", StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    query.Append("&").Append(_key).Append("=").Append(value);
                }
            }

            query.Append("&key=").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 == MD5_Format.UPPER)
                    {
                        hex = bytes[i].ToString("X2");                   //大写
                    }
                    else
                    {
                        hex = bytes[i].ToString("x2");                   //小写
                    }
                    result.Append(hex);
                }
            }

            return(result.ToString());
        }