在工作中遇到了一个需求,将多个系统的数据迁移,并且要求在一个新系统中能够查看到每个旧系统的数据。因为每个系统相对独立,数据对于新系统来说就是中性的,因此保证安全性非常重要,在此记录一下我保障安全使用到的几种方法。
1.数据交互的安全性(使用加密)在新系统向旧系统发起请求时,如何做到防重演、防入侵。
在此使用了签名sha256加密的方式。
public static MapgetSignatureByKeySort(String paasToken,Map args) { long timeStamp = System.currentTimeMillis() / 1000L; long nonce = RandomUtil.randomLong(); StringBuilder sb = new StringBuilder(); sb.append(timeStamp).append(paasToken).append(nonce); args.entrySet().stream().sorted(Map.Entry.comparingByKey()) .map(Map.Entry::getValue) .filter(Objects::nonNull).forEach(v -> sb.append(',').append(v)); sb.append(timeStamp); String sig = SecureUtil.sha256(sb.toString()); Map map = new HashMap<>(); map.put("taSignature", sig); map.put("taTimestamp", String.valueOf(timeStamp)); map.put("taNonce", String.valueOf(nonce)); return map; }
代码说明:在新系统中,使用当前时间戳、随机数、请求参数、以及自定义的passToken,使用sha256加密生成签名,并且将当前时间戳、随机数、签名放到请求头中向旧系统发起请求。其中参数的加密顺序以排序升序的方式进行加密。
在旧系统得到响应时,获取到请求头中的时间戳、随机数,在通过配置文件中的passToken和参数进行加密、并且判断时间戳与当前时间是否相差30分钟,以达到防重演的效果。(服务器时间各有差异,该事件根据实际情况自定义),若加密出来的签名与请求头中签名相同,则验证通过。
2.X-Accel-Redirect内部转发在浏览器中Network中能够查看到每个请求的信息,若使用真实的ip地址就会有安全隐患漏洞。
使用Nginx中的X-Accel-Redirect做内部转发能够很好的解决问题。
如图所示,在新系统(服务端A)发起请求,再从内部转发到旧系统(服务端B),保证数据的安全性。
public void realView(HttpServletRequest request, HttpServletResponse response, String viewUrl, String menuId) { try { ListqueryList = null; if (viewUrl != null) queryList = Arrays.asList(viewUrl.split(",")); StringBuffer queryString = new StringBuffer(); int num = 1; for (String query : queryList) { if (num == 1) queryString.append("?" + query); else queryString.append("&" + query); num++; } MenuViewVO vo = menuConfigService.getById(menuId); queryString.append("&__key=" + vo.get__key()); String realView = vo.getViewUrl(); response.setHeader("X-Accel-Buffering", "no"); // default yes response.setHeader("X-Accel-Redirect", realView + queryString); } catch (Exception e) { e.printStackTrace(); } }
目前先记录这两种方法,还有几种方法后续再更新。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)