Example #1
0
        /// <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());
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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));
        }
Example #6
0
        /// <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());
        }