最近项目需求,要求给项目进行加签验签。目的是为了防止数据被篡改,加强数据安全性。
加签验签的功能实现大致分为:
1(加签)前端对数据进行MD5加密,将MD5后的key放入请求头中,与数据一同传入后台。
2(验签)后台接收数据时,在aop层对传输过来的数据重新进行MD5加密,并且取出请求头中的key,与其对比若一致则表明数据没有被篡改,若不一致则表示数据遭到篡改直接返回提示“验签失败”。
1 @Around("md5InfoBefore()") 2 public Object md5InfoBefore(ProceedingJoinPoint point) throws Throwable { 3 log.info("--------md5InfoBefore PointCut Start--------"); 4 HttpServletRequest request = getHttpServletRequest(); 5 String requestUri = request.getRequestURI(); 6 log.info("--------requestUri:"+requestUri); 7 //切点中获取requestBody中的值 8 Object[] objects = point.getArgs(); 9 Map<String,Object> reqData=(Map<String, Object>) objects[0]; 10 String key= MD5Encrypt.encodeWithoutfix(reqData.get("data").toString()+"&appKey=778899&AppSecret=123456" + new SimpleDateFormat("yyyyMMdd").format(new Date())); 11 if (!request.getHeader("key").equals(key) || StringUtils.isEmpty(request.getHeader("key"))){ 12 throw new Exception("验签失败"); 13 } 14 Map<String,Object> maps=new HashMap<>(); 15 maps.put("data",JsonUtil.jsonToBean(reqData.get("data").toString(),Map.class)); 16 objects[0] =maps; 17 return point.proceed(objects); 18 }
3(问题)一开始前后端加签一直不成功,原因:前端传入的data数据在后台接收时,顺序会被打乱,后端将乱序的data数据进行MD5后会产生不同的key因此与前端的key不一致。
解决方案:前端将data数据传入后台时,对数据进行json转化,转成String类型。后台接收时,以String类型接收并且进行MD5这样就会与前端的key一致从而通过验签。