手机版

jwt ASP.NET MVC时间戳防止重放攻击的详细说明

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

时间戳功能

客户端正在向服务器接口发出请求。如果请求信息被加密,并且请求包被第三方截获,则请求包可用于重复请求操作。如果服务器不进行反重放攻击,服务器压力会增加,使用时间戳可以解决这个问题。

前一篇文章谈到了JWT安全核查行动。现在,时间戳被组合以防止重复攻击,并使用Headers中第三方包抓取工具截取的令牌来模拟请求操作。

防篡改

常用的方法是将参数、当前项AppKey和双方约定的“密钥”进行拼接,添加到Dictionary字典集中,按ABCD顺序排序,最后用MD5加密。客户端将加密的字符串和请求的参数发送到服务器。服务器根据

上述规则拼接加密后,是否等于传入的加密字符串

防止重复使用

如果用上面的方式加密,就解决不了反复用的问题。此时,您需要分别在客户端和服务器上生成UTC时间戳。此世界协调时是为了防止您的客户端和服务器处于同一时区。呵呵,那你就把时间戳拼在密文里。至于反重复使用的效果,

让我们言归正传,开始编码吧

创建解密类

公共类解密{///summary/////注意,它是8个字符,64位/////summary Private静态字符串PrivateRSA=Configuration Manager。app settings[' privatesa '];///Summary////注意是8个字符,64位////Summary Private Static String Public RSA=Configuration Manager。AppSettings[' Public RSA '];///summary///encryption////summary//param name=' data '/param///returns/returns public static string encode(字符串数据){ byte[]by key=encoding . ascii . getbytes(privatersa);字节[] byIV=编码。ASCII . GetBytes(public RSA);desryptoseservice provider crypto provider=new desryptoseservice provider();int i=cryptoProvider。KeySizememory stream ms=new memory stream();crypto stream CST=new crypto stream(ms,cryptoProvider)。createencrypter(byKey,byIV),CryptoStreamMode。写);stream writer SW=new stream writer(CST);西南航空。写(数据);西南航空。flush();cst。flushFillBlock();西南航空。flush();返回Convert。ToBase64String(ms.GetBuffer(),0,(int)ms . Length);}///summary////decrypt/////summary//param name=' data '/param////returns/returns public static string decode(字符串数据){ byte[]by key=encoding . ascii . getbytes(privatersa);字节[] byIV=编码。ASCII . GetBytes(public RSA);字节[]BYENC;尝试{ byEnc=Convert。FromBase64String(数据);} catch { return null}解扰服务提供商cryptoProvider=new解扰服务提供商();memory stream ms=new memory stream(Byenc);crypto stream CST=new crypto stream(ms,cryptoProvider)。CreateDecryptor(byKey,byIV),CryptoStreamMode。阅读);StreamReader sr=新的stream reader(CST);返回Sr . ReadToEnd();}}然后向MyAuthorizeAttribute添加时间戳以验证该方法

作为请求传入DESC签名时间字符串

如果传入的时间戳小于服务器的当前时间,则返回false,表示权限不足

如果传入的时间戳大于服务器的当前时间,则对于正常访问,返回true

完美的解决方案是在redis中设置jwtToken的到期时间。每个人都想让我完成它。

请留言-我会及时更新GitHub来完成这个dmeo

//请求参数字符串requesttime=httpcontext。请求[' rtime '];//请求时间由DESC if(字符串)签名。is ullrempty(request time))返回false//desc解密后的时间戳是请求datetime request dt=datetime . parse(description decode(request time))的有效时间。addminutes (int.parse(时间戳));DateTime Newdt=DateTime。现在;//服务器接收请求的当前时间if(Requestdt Newdt){ return false;} else {//做其他操作var userinfo=jwthelp . getjwtcode(auth header);//例如,生成jwtToken并将其存储在redis中。//在这个地方,使用jwtToken作为获取实体val的密钥,根据redis if(userinfo . username==' admin ' userinfo . pwd==' 123 ')返回true,查看jwtToken是否相同;}如果需要了解新手教程的其他内容,可以给我留言。我将在三天内为大家写一个简单的教学演示

后来的ASP.NET API,ASP。NET Core,Java教程都可以用。

https://github.com/yaols/JWT.MvcDemo(本地下载)

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:jwt ASP.NET MVC时间戳防止重放攻击的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。