这篇文章主要介绍了JWT+ASP.NET MVC时间戳如何防止重放攻击,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
时间戳作用
客户端在向服务端接口进行请求,如果请求信息进行了加密处理,被第三方截取到请求包,可以使用该请求包进行重复请求操作。如果服务端不进行防重放攻击,就会服务器压力增大,而使用时间戳的方式可以解决这一问题。
防篡改
一般使用的方式就是把参数拼接,当前项目AppKey,双方约定的“密钥”,加入到Dictionary字典集中,按ABCD顺序进行排序,最后在MD5+加密.客户端将加密字符串和请求参数一起发送给服务器。服务器按照
上述规则拼接加密后,与传入过来的加密字符串比较是否相等
防复用
上面的方式进行加密,就无法解决防复用的问题,这时需要在客户端和服务端分别生成UTC的时间戳,这个UTC是防止你的客户端与服务端不在同一个时区,呵呵,然后把时间戳timestamp拼在密文里就可以了,至于防复用的有效性
下面进入正题,编码启动
创建 DESCryption 帮助类
public class DESCryption
{
/// <summary>
/// //注意了,是8个字符,64位
/// </summary>
private static string PrivateRsa = ConfigurationManager.AppSettings["PrivateRsa"];
/// <summary>
/// //注意了,是8个字符,64位
/// </summary>
private static string PublicRsa = ConfigurationManager.AppSettings["PublicRsa"];
/// <summary>
/// 加密
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string Encode(string data)
{
byte[] byKey = Encoding.ASCII.GetBytes(PrivateRsa);
byte[] byIV = Encoding.ASCII.GetBytes(PublicRsa);
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
int i = cryptoProvider.KeySize;
MemoryStream ms = new MemoryStream();
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
StreamWriter sw = new StreamWriter(cst);
sw.Write(data);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
}
/// <summary>
/// 解密
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string Decode(string data)
{
byte[] byKey = Encoding.ASCII.GetBytes(PrivateRsa);
byte[] byIV = Encoding.ASCII.GetBytes(PublicRsa);
byte[] byEnc;
try
{
byEnc = Convert.FromBase64String(data);
}
catch
{
return null;
}
DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
MemoryStream ms = new MemoryStream(byEnc);
CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
StreamReader sr = new StreamReader(cst);
return sr.ReadToEnd();
}
}
然后在MyAuthorizeAttribute 加上时间戳验证方法
将DESC签名时间字符串 当作请求传入
如果传入的时间戳小于服务器当前时间 返回false 提示权限不足
如果传入的时间戳大于服务器当前时间 返回true 可以正常访问
完美方案就是将redis中jwtToken设置过期时间 各位兄台希望我补充完整,
请留言--我会及时更新GitHub将这个dmeo补充完整
//请求参数
string requestTime = httpContext.Request["rtime"]; //请求时间经过DESC签名
if (string.IsNullOrEmpty(requestTime))
return false;
//请求时间DESC解密后加上时间戳的时间即该请求的有效时间
DateTime Requestdt = DateTime.Parse(DESCryption.Decode(requestTime)).AddMinutes(int.Parse(TimeStamp));
DateTime Newdt = DateTime.Now; //服务器接收请求的当前时间
if (Requestdt < Newdt)
{
return false;
}
else
{
//进行其他操作
var userinfo = JwtHelp.GetJwtDecode(authHeader);
//举个例子 生成jwtToken 存入redis中
//这个地方用jwtToken当作key 获取实体val 然后看看jwtToken根据redis是否一样
if (userinfo.UserName == "admin" && userinfo.Pwd == "123")
return true;
}
感谢你能够认真阅读完这篇文章,希望小编分享的“JWT+ASP.NET MVC时间戳如何防止重放攻击”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。