防重放攻击

2020-08-05  本文已影响0人  Sun_c39f
  1. 使用时间戳方式
    在请求参数中添加时间戳参数,服务器端首先验证时间戳timestamp是否有效,比如是服务器时间戳5分钟之前的请求视为无效。

  2. 使用签名验证+用户编号的方式
    举个例子:
    1、String sign = MD5(参数+密钥+时间戳 )得本次请求的签名。
    2、在Redis中记录key=用户编号,value=签名值。

protected void replayAttackDefending(EncryptModel encryptModel) {
        /**
         * 如果未开启防重放攻击则返回
         */
        if (!this.replayAttack) {
            return;
        }
        /**
         * 时间判断
         */
        Long ts = Long.valueOf(encryptModel.getTs());
        Long current = System.currentTimeMillis();
        int tenMinutes = 10 * 60 * 1000;
        if (current - ts > tenMinutes) {
            ResponseEnum.PERMISSION_NOT_SAFE.assertNotNull(null);
        }
        /**
         * 重复判断
         */
        ClientLoginVo loginUser = LoginContextUtil.getLoginUser();
        log.info("the login user is {}", JSON.toJSONString(loginUser));
        String key = loginUser.getId() + "_" + encryptModel.getSign();
        boolean isExists = redisUtil.setIfAbsent(key, "", Duration.ofMinutes(5));
        ResponseEnum.PERMISSION_NOT_SAFE.assertEquals(false, isExists);
    }
上一篇 下一篇

猜你喜欢

热点阅读