88 lines
3.2 KiB
C#
88 lines
3.2 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Security.Cryptography;
|
|||
|
|
using System.Text;
|
|||
|
|
|
|||
|
|
namespace EastChanger
|
|||
|
|
{
|
|||
|
|
public static class SignUtil
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// sign生成
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="paramsMap"></param>
|
|||
|
|
/// <param name="secret"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static string BuildSign(Dictionary<string, object> paramsMap, string secret)
|
|||
|
|
{
|
|||
|
|
//var keySet = paramsMap.Keys;
|
|||
|
|
List<string> paramNames = paramsMap.Keys.ToList();
|
|||
|
|
paramNames.Sort();
|
|||
|
|
StringBuilder paramNameValue = new StringBuilder();
|
|||
|
|
foreach (var paramName in paramNames)
|
|||
|
|
{
|
|||
|
|
paramNameValue.Append(paramName).Append(paramsMap[paramName]);
|
|||
|
|
}
|
|||
|
|
string source = secret + paramNameValue.ToString() + secret;
|
|||
|
|
return ToMD5(source);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// MD加密
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="message"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static string ToMD5(string message)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
// 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
|
|||
|
|
MD5 md5 = new MD5CryptoServiceProvider();
|
|||
|
|
// 2 将消息变成byte数组
|
|||
|
|
byte[] input = Encoding.UTF8.GetBytes(message);
|
|||
|
|
// 3 计算后获得字节数组,这就是那128位了
|
|||
|
|
byte[] buff = md5.ComputeHash(input);
|
|||
|
|
// 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
|
|||
|
|
return Byte2hex(buff);
|
|||
|
|
}
|
|||
|
|
catch (Exception e)
|
|||
|
|
{
|
|||
|
|
throw e;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static string Byte2hex(byte[] bytes)
|
|||
|
|
{
|
|||
|
|
//创建一个StringBuilder对象来存储最终的结果
|
|||
|
|
StringBuilder sign = new StringBuilder();
|
|||
|
|
//使用for循环遍历字节数组中的每个字节
|
|||
|
|
for (int i = 0; i < bytes.Length; i++)
|
|||
|
|
{
|
|||
|
|
// 将字节强制转换为整数,并对其进行位运算,即保留后八位的值,并转换为十六进制形式的字符串
|
|||
|
|
string hex = bytes[i].ToString("x2");
|
|||
|
|
// 如果转换后的字符串长度为1,即只有1位,则在前面添加一个0,以保证每个字节都是两位十六进制数
|
|||
|
|
if (hex.Length == 1)
|
|||
|
|
{
|
|||
|
|
sign.Append("0");
|
|||
|
|
}
|
|||
|
|
// 将转换后的字符串追加到StringBuilder对象中,并转换为大写形式
|
|||
|
|
sign.Append(hex.ToUpper());
|
|||
|
|
}
|
|||
|
|
return sign.ToString();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static string UrlEncode(string str)
|
|||
|
|
{
|
|||
|
|
StringBuilder sb = new StringBuilder();
|
|||
|
|
byte[] byStr = System.Text.Encoding.UTF8.GetBytes(str); //默认是System.Text.Encoding.Default.GetBytes(str)
|
|||
|
|
for (int i = 0; i < byStr.Length; i++)
|
|||
|
|
{
|
|||
|
|
sb.Append(@"%" + Convert.ToString(byStr[i], 16));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return (sb.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|