多个项目之间交互的安全性

多个项目之间交互的安全性,第1张

多个项目之间交互的安全性

在工作中遇到了一个需求,将多个系统的数据迁移,并且要求在一个新系统中能够查看到每个旧系统的数据。因为每个系统相对独立,数据对于新系统来说就是中性的,因此保证安全性非常重要,在此记录一下我保障安全使用到的几种方法。

1.数据交互的安全性(使用加密)

在新系统向旧系统发起请求时,如何做到防重演、防入侵。
在此使用了签名sha256加密的方式。

public static Map getSignatureByKeySort(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 {
            List queryList = 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();
        }
    }

目前先记录这两种方法,还有几种方法后续再更新。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5684766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存