日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web前后端笔记-通过对称加密算法和信息摘要算法防止数据重放

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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前后端笔记-通过对称加密算法和信息摘要算法防止数据重放的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。