资讯专栏INFORMATION COLUMN

API接口安全性设计思路

mikyou / 455人阅读

在工作中经常遇见项目对接,那么该如何写一个安全的接口供给对方调用呢???

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);  
            }  
      }  
}  

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71188.html

相关文章

  • Hybrid APP架构设计思路

    摘要:本文将从以下几个方面阐述架构设计的一些经验和思考。原文及讨论请到通讯作为一种跨语言开发模式,通讯层是架构首先应该考虑和设计的,往后所有的逻辑都是基于通讯层展开。 关于Hybrid模式开发app的好处,网络上已有很多文章阐述了,这里不展开。 本文将从以下几个方面阐述Hybrid app架构设计的一些经验和思考。 原文及讨论请到 github issue 通讯 作为一种跨语言开发模式,通讯...

    hiyayiji 评论0 收藏0
  • 权限设计的杂谈

    摘要:权限设计的杂谈这篇文章的定位,不是宣传某个框架,仅仅之是梳理一下有关权限方面的一些想法和最近项目中的一些探索过程。而这两者的取舍则是有设计人员决定的。数据抽象原则最小特权划分从某个程度上来说决定了控制的对象,而数据抽象原则是是决定了操作。 权限设计的杂谈 这篇文章的定位,不是宣传某个框架,仅仅之是梳理一下有关权限方面的一些想法和最近项目中的一些探索过程。我们主要想解决一下问题。 什么...

    yck 评论0 收藏0
  • Api项目设计攻略

    摘要:总结一下数据保护的技术点参数传输使用密文,可以使用对称加密非对称加密或者两者的结合,比如请求就是属于两者结合的方式。安全性一些常用的安全问题都要考虑到,并且在项目框架底层进行防范,例如攻击注入问题单用户或者单的访问频率控制来进行防攻击。 App所有数据都来源于服务器,App和服务器交互普遍是采用http请求接口的方式,那么在搭建和维护一个后端Api项目时候需要注意哪些问题呢? 1. 数...

    scq000 评论0 收藏0
  • 接口测试要测试什么?

    摘要:接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。二接口测试用例设计接口测试的用例设计是关键,不能只是单纯正常请求通过就算接口测试过了,要从业务功能性能等上去设计用例。 ...

    邱勇 评论0 收藏0
  • Java面试通关要点汇总集

    摘要:本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答。敬请关注服务端思维微信公众号,获取最新文章。 原文地址:梁桂钊的博客博客地址:http://blog.720ui.com 这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术。本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进...

    gougoujiang 评论0 收藏0

发表评论

0条评论

mikyou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<