API接口安全性设计思路

1.公共接口,任何人都可以访问调用

      1.1.适合场景,公司后台整合广告管理,提供统一的接口返回给公司其他项目调用和邮件模板调用,这时候需要设计一个统一的接口,返回广告的内容。还有天气查询等场景。  

@PostMapping("/syncInfo") 
public Result syncInfo(@RequestParam(name = "data")String data){
          if(!StringUtils.isNotBlank(data)){
              return  new Result("失败!",false,HttpCode.STATUS_104);
          }
          InfoVo infoVo = JSONObject.parseObject(data,InfoVo.class);
          dealInfo(infoVo);
          return  new Result("成功!",true, HttpCode.STATUS_200);
 }
2.接口参数加密

           2.1.适合场景,公司内部两个项目组进行对接,为了防止接口被暴露和伪造访问,这个时候需要对参数进行加密处理,防止接口被其他外部人员调用,一般采用desc或者aes对称加密,约定好秘钥进行对接。

    @PostMapping("/syncInfo")
    public Result syncInfo(@RequestParam(name = "data")String data){
        try {
              if(!StringUtils.isNotBlank(data)){
                  return  new Result("失败!",false,HttpCode.STATUS_104);
              }
              DES des = new DES("秘钥".getBytes());
              String j = des.decryptStr(data);
              logger.debug("解码前:" + data);
              logger.debug("解码后:" + j);
              InfoVo infoVo = JSONObject.parseObject(j,InfoVo.class);
              dealInfo(infoVo);
              return  new Result("成功!",true, HttpCode.STATUS_200);
          }catch (Exception e){
                e.printStackTrace();
                if(!StringUtils.isNotBlank(data)){
                    return  new Result("系统错误!",false,HttpCode.STATUS_105);
                }
          }
        
    }
3.接口时效性加密+接口参数加密

            3.1.适合场景,内部接口加密过的数据链接被暴露,不断有相同数据对接口进行访问,这个适合需要对接口加入时间戳参数,设计失效时间解决这个问题。

   @PostMapping("/syncInfo")
    public Result syncInfo(@RequestParam(name = "data")String data){
        try {
              if(!StringUtils.isNotBlank(data)){
                  return  new Result("失败!",false,HttpCode.STATUS_104);
              }
              DES des = new DES("秘钥".getBytes());
              String j = des.decryptStr(data);
              logger.debug("解码前:" + data);
              logger.debug("解码后:" + j);
              InfoVo infoVo = JSONObject.parseObject(j,InfoVo.class);
              if(AddSecondes(infoVo.getTime(),20) < new Date().getTime()){
                  return new Result("接口失效!",false,HttpCode.STATUS_100);
              }
              dealInfo(infoVo);
              return new Result("成功!",true, HttpCode.STATUS_200);
          }catch (Exception e){
                e.printStackTrace();
                if(!StringUtils.isNotBlank(data)){
                    return new Result("系统错误!",false,HttpCode.STATUS_105);
                }
          }

    }
4.接口时效性+接口参数加密+不同来源的私钥
             4.1适合场景, 当接口秘钥被泄露时,我们可以对不同的数据来源设置不同的私钥,这样即使接口秘钥被泄露,没有私钥,依然不能对接口进行操作,而且可以记录是哪个项目的秘钥被泄露,快速定位出问题的来源,且不会影响其他项目调用。
    @PostMapping("/syncInfo")
    public Result syncInfo(@RequestParam(name = "data")String data){
        try {
              if(!StringUtils.isNotBlank(data)){
                  return  new Result("失败!",false,HttpCode.STATUS_104);
              }
              DES des = new DES("基础秘钥".getBytes());
              String j = des.decryptStr(data);
              logger.debug("解码前:" + data);
              logger.debug("解码后:" + j);
              InfoVo infoVo = JSONObject.parseObject(j,InfoVo.class);
              if(AddSecondes(infoVo.getTime(),20) < new Date().getTime()){
                  return  new Result("接口失效!",false,HttpCode.STATUS_100);
              }
              String sign = getSignByFrom(Info.getFrom());
              logger.debug("来源秘钥"+sign);
              String k = des.decryptStr(Info.getData);
              dealInfo(k);
              return  new Result("成功!",true, HttpCode.STATUS_200);
          }catch (Exception e){
                e.printStackTrace();
                if(!StringUtils.isNotBlank(data)){
                    return  new Result("系统错误!",false,HttpCode.STATUS_105);
                }
          }

    }


  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值