Web前后端笔记-通过对称加密算法和信息摘要算法防止数据重放
生活随笔
收集整理的這篇文章主要介紹了
Web前后端笔记-通过对称加密算法和信息摘要算法防止数据重放
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
理論圖如下:
這里使用時間戳和隨機數和正常提交的表單數據生成MD5摘要,再使用某16位密鑰把MD5進行AES加密,生成128位的數據。然后提交給服務器。
?
服務器先看提交的時間戳是否在范圍內(如2分鐘),如果時間非法就直接返回。
然后看各個數據進行某種有規則的算法,生成MD5看看是否與提交的MD5一樣,不一樣說明是被串改的。
如果MD5一樣,對比下數據庫中目前時間范圍內(如2分鐘)是不是二次提交,如果是就拒絕。
將MD5和某16位密鑰進行AES加密,如果和客戶端傳上來的一樣,那么就可以回數據了。
?
?
這里本人貼下對應的后端代碼:
前端請求如下:
后端代碼如下:
@SuppressWarnings("ALL") @Component public class XInterceptor extends HandlerInterceptorAdapter {@AutowiredAuthXXXXService authService;@Overridepublic 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();Enumeration<String> parameterNames = httpServletRequest.getParameterNames();Map<String, String[]> 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;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {} }這里提下
AuthXXXXService存儲了MD5的相關數據。這里在Spring Boot中有個調度線程池
如下,每隔一段數據就清空下:
?
總結
以上是生活随笔為你收集整理的Web前后端笔记-通过对称加密算法和信息摘要算法防止数据重放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt工作笔记-正则表达式QProcess
- 下一篇: Java工作笔记-枚举类型反射