在c# api开发过程中我们的接口需要做相应的安全性防御,需要前端按约定生成数据签名sign值(一般是请求body字符串+当前毫秒时间戳+自定义密码),然后后端接收到数据包和sing签名值后根据约定的算法规则验签。这个时候就我们需要用到sign签名算法来制作自己的sign签名验签工具类。本文分别列举了base64签名和md5签名生成示例代码供大家参考,示例代码如下。
Base64签名
/// <summary>
/// 获取签名
/// </summary>
/// <param name="_doc"></param>
/// <returns></returns>
private static string EncryptSign(string _doc, string _pwd = "123456")
{
//_doc是要对其签名的内容,即数据包
//_pwd是签名密码,可以是secretKey也可以是其他,具体需要和接口提供方自行协商。
var _text = _doc + _pwd;
byte[] _input = Encoding.GetEncoding("GBK").GetBytes(_text);
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
byte[] _output = md5.ComputeHash(_input);
var sing = @Convert.ToBase64String(_output);
return sing;
}
}
MD5签名
/// <summary>
/// 获取签名
/// </summary>
/// <param name="_doc"></param>
/// <returns></returns>
private static string EncryptSign(string _doc, string _pwd = "123456")
{
//_doc是要对其签名的内容,即数据包
//_pwd是签名密码,可以是secretKey也可以是其他,具体需要和接口提供方自行协商。
var _text = _doc + _pwd;
byte[] _input = Encoding.GetEncoding("GBK").GetBytes(_text);
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
byte[] _output = md5.ComputeHash(_input);
string sign = string.Empty;
for (int i = 0; i < _output.Length; i++)
{
sign += _output[i].ToString("x");
}
return sign;
}
}
如果是.netframework程序,上面的代码可以直接拿去根据实际业务使用。但是.netcore需要安装“System.Text.Encoding.CodePages”包,然后在Encoding.GetEncoding("GBK").GetBytes(_text)
之前加上如下代码否则会报错。具体原因参考我的这篇文章 C# 程序中抛出'GB2312' is not a supported异常的解决办法 - 实用工具_软件教程_.net_c#-有码挺好个人博客 (cisharp.com)
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);