简易身份校验机制

这个一个简易的接口用户身份校验机制

优点:
1, 用当前时间加盐, 防止重放攻击
2, 每次接口调用都可以知道是哪个用户请求的
3, 服务器不用管理Session
缺点:
2, 如果客户端的时间有问题,或者与服务器不在同一个时区,将无法调用服务器

获取Authorization参数的C#算法:

/**
 * a,将用户名,当前时间,用户密码分别用Base64SecureURL加密, 再用点号拼接成一个字符串, 
 * 类似这样的格式: Base64(UserCode).Base64(yyyyMMddHHmmss).Base64(Password), 
 * 然后把这个字符串用MD5加密得到32位密文
 * b,用户名,当前时间,MD5密文分别用Base64SecureURL加密, 再用点号拼接成一个字符串token, 
 * 类似这样的格式: Base64(UserCode).Base64(yyyyMMddHHmmss).Base64(MD5)
 * c,然后把b步骤得到的字符串token作为Header参数Authorization参数值
 * 检验说明: 当前时间(yyyyMMddHHmmss)应该准确,如果跟当前时间相差30分钟将返回授权失败
 * 服务器校验方法: 得到token后反编码得到用户名和时间,并查询数据库得到密码,按照步骤a,得到MD5与token内的一致表示身份认证成功
 * 服务端token校验规则
 * 1, token是否正确: 校验密码
 * 2, token是否有效: 当前时间前后24小时内(防止时区差异)
 * 3, 同一token使用次数不能超过5次: 防止token被拦截后重复使用
 */
public static string CreateToken(string userCode, string userPassword)
{
	string baseUserCode = Base64UrlEncode(userCode);
	string baseTimeNow = Base64UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmss"));
	string baseUserPassword = Base64UrlEncode(userPassword);
	string plaintext = baseUserCode + "." + baseTimeNow + "." + baseUserPassword;
	string cryptograph = Get32MD5One(plaintext); //MD5加密
	string baseCryptograph = Base64UrlEncode(cryptograph);
	string authorizationValue = baseUserCode + "." + baseTimeNow + "." + baseCryptograph; //拼接成参数值
	return authorizationValue;
}

/// <summary>
/// 字符串编码为Base64Url
/// </summary>
/// <param name="text">待编码的文本字符串</param>
/// <returns>编码的文本字符串.</returns>
public static string Base64UrlEncode(string text)
{
	var plainTextBytes = Encoding.UTF8.GetBytes(text);
	var base64 = Convert.ToBase64String(plainTextBytes).Replace('+', '-').Replace('/', '_').TrimEnd('=');
	return base64;
}

/// <summary>
/// 解码安全的URL文本字符串的Base64
/// </summary>
/// <param name="secureUrlBase64">Base64编码字符串安全的URL.</param>
/// <returns>Cadena de texto decodificada.</returns>
public static string Base64UrlDecode(string secureUrlBase64)
{
	secureUrlBase64 = secureUrlBase64.Replace('-', '+').Replace('_', '/');
	switch (secureUrlBase64.Length % 4)
	{
		case 2:
			secureUrlBase64 += "==";
			break;
		case 3:
			secureUrlBase64 += "=";
			break;
	}
	var bytes = Convert.FromBase64String(secureUrlBase64);
	return Encoding.UTF8.GetString(bytes);
}

/// <summary>
/// 此代码示例通过创建哈希字符串适用于任何 MD5 哈希函数 (在任何平台) 上创建 32 个字符的十六进制格式哈希字符串
/// 官网案例改编
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static string Get32MD5One(string source)
{
	using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
	{
		byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
		System.Text.StringBuilder sBuilder = new System.Text.StringBuilder();
		for (int i = 0; i < data.Length; i++)
		{
			sBuilder.Append(data[i].ToString("x2"));
		}

		string hash = sBuilder.ToString();
		return hash.ToUpper();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值