Web前后端笔记-通过对称加密算法和信息摘要算法防止数据重放
发布日期:2021-06-30 10:43:15
浏览次数:3
分类:技术文章
本文共 3517 字,大约阅读时间需要 11 分钟。
理论图如下:
这里使用时间戳和随机数和正常提交的表单数据生成MD5摘要,再使用某16位密钥把MD5进行AES加密,生成128位的数据。然后提交给服务器。
服务器先看提交的时间戳是否在范围内(如2分钟),如果时间非法就直接返回。
然后看各个数据进行某种有规则的算法,生成MD5看看是否与提交的MD5一样,不一样说明是被串改的。
如果MD5一样,对比下数据库中目前时间范围内(如2分钟)是不是二次提交,如果是就拒绝。
将MD5和某16位密钥进行AES加密,如果和客户端传上来的一样,那么就可以回数据了。
这里本人贴下对应的后端代码:
前端请求如下:
后端代码如下:
@SuppressWarnings("ALL")@Componentpublic class XInterceptor extends HandlerInterceptorAdapter { @Autowired AuthXXXXService authService; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { if(httpServletRequest.getMethod().equals("GET")){ String url = httpServletRequest.getRequestURI(); String contextPath = httpServletRequest.getServletPath(); String para = httpServletRequest.getQueryString(); EnumerationparameterNames = httpServletRequest.getParameterNames(); Map parameterMap = httpServletRequest.getParameterMap(); //参数是否正常 if(!parameterMap.containsKey("timestamp") || !parameterMap.containsKey("signature") || !parameterMap.containsKey("shield")){ httpServletResponse.sendError(VoXXXXEm.PARA_ERROR.getCode()); return false; } //先检测签名是否过期 30s内不会过期 Long timestamp = Long.valueOf(parameterMap.get("timestamp")[0]); Long currentStamp = System.currentTimeMillis(); if(timestamp < (currentStamp - 30 * 1000)){ httpServletResponse.sendError(VoEm.TIMEOUT.getCode()); return false; } //检查签名是否合法 String originStr = ""; for(Enumeration key = parameterNames ; parameterNames.hasMoreElements();){ String KeyPara = key.nextElement().toString(); if(KeyPara.equals("signature") || KeyPara.equals("shield")) continue; originStr += parameterMap.get(KeyPara)[0] + "$"; } originStr = originStr.substring(0, originStr.length() - 1); String md5Str = MD5Utils.generateMD5(originStr); //验证签名 if(!md5Str.equals(parameterMap.get("signature")[0])){ httpServletResponse.sendError(VoXXXXEm.SIGN_ERROR.getCode()); return false; } //禁止重放 if(authService.isSignatureInResetMap(md5Str)){ httpServletResponse.sendError(VoXXXXEm.REST_ERROR.getCode()); return false; } //验证护盾 String originShield = parameterMap.get("shield")[0]; //key值为签名的前16位 String decrypt = AESUtil.decrypt(originShield, parameterMap.get("signature")[0].substring(0, 16)); if(!parameterMap.get("signature")[0].equals(decrypt)){ httpServletResponse.sendError(VoXXXXEm.SHIELD_ERROR.getCode()); return false; } //加入到禁止重放里面 authService.addResetMap(md5Str, timestamp); //System.out.println("over"); } else{ } return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { }}
这里提下
AuthXXXXService存储了MD5的相关数据。这里在Spring Boot中有个调度线程池
如下,每隔一段数据就清空下:
转载地址:https://it1995.blog.csdn.net/article/details/106230138 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月22日 01时59分49秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SQL Server表分区
2019-04-30
Ms sqlserver2008 R2大数据表的分区实现
2019-04-30
性能分析—查询运行慢的原因(SQLServer2008宝典)
2019-04-30
sqlserver2008 死锁解决方法及性能优化方法
2019-04-30
sqlserver动态分区方案例子
2019-04-30
获取浏览器详细信息
2019-04-30
JS获取浏览器类型和版本信息
2019-04-30
canvas2image.js
2019-04-30
base64
2019-04-30
使用JavaScript将图片保存至本地
2019-04-30
Webbrowser指定IE内核版本(更改注册表)
2019-04-30
95.多栏显示
2019-04-30
96.分级汇总
2019-04-30
97.分组交叉表、复杂交叉表
2019-04-30
98.格式化报表
2019-04-30
99.固定行列报表
2019-04-30
100.行列转换
2019-04-30
101.交叉表分析
2019-04-30
102.交叉表-复杂名次
2019-04-30
102.交叉表-优先级处理
2019-04-30