我们是这样设计对外安全接口的

背景

在日常工作中难免会调用第三方系统的接口,一个项目会有多个服务组合而成,负责各自核心的服务,在接触的项目中他主要以门户服务、核心服务组合而成。

大部分门户服务会调用核心服务。当然如果有支付业务,会调用其他部门的支付服务,这样的话设计一个统一安全的对外接口就极为重要。

安全措施

AppId机制

并不是谁都可以来调用的服务的。需要使用接口的服务需要在后台开通appId和相应密钥。

数据加密

数据在传输的过程中是很容易被抓包的,常见的做法对请求的内容做数据加密。

数据加签

数据在传输的过程中很容易被篡改,常见的做法是利用数据加签发送者产生一段无法伪造的数字串,来保证数据在传输的过程中不被篡改。

限流机制

本来就是真实的用户,并且开通了appid,但是出现频繁调用接口的情况,这种情况需要给相关appid限流处理,常用的限流算法有令牌桶。

实际项目中是如何实现的?

AppId机制

我们项目中AppId机制是由应用+终端组合的,也就是说一个应用会有多个终端。在运营平台里开通相应应用AppId,应用底下添加相应的终端TermId,之后就可以请求我们的服务要带上AppId、TermId。当然添加应用的时候会产生有对应的密钥(随机32位),这个密钥是用来加密+签名的。

运营平台提供运营商、商户入驻。每个商户入驻都会得到一个终端Id。如果是提供给公司其他部门,运营平台会用admin账户提前分配一套一个AppId和TermId给其他部门使用。

数据加密加签SDK

相信大家在开发过程中如果有接触调用第三方API的时候会映入对方的SDK,之后调用对方API如下:

我们的做法也是类似。我们有一个专门的项目SDK。该SDK包含加密解密加签验签功能,别人的服务要调用我们的服务,先引入我们的SDK。SDK由TransRequest 、Handler、TransResponse三大部分组成

TransRequest是请求模板,对应的app_id、app_key、term_id、加密类型、签名类型、请求内容、请求方法等。Handler主要是对信息签名加密、请求具体的服务、信息解密验签。请求具体的服务本质还是用HttpClient调用。TransResponse是统一返回模板

数据加密

加密方式有对称加密和非对称加密

对称加密:对称加密在加密和解密的过程中使用的密钥是相同的,常见的对称加密算法有DES,AES;有点计算速度快。缺点:发送方接收方商定好密钥。

非对称加密:服务端会生成一对密钥,私钥存放在服务端,公钥可以发给任何人使用。优点:安全。缺点:速度慢。

我们采取的是AES加密,所以一般运营平台里AppId生成的密钥给调用方。

数据加签

数据签名我们是将TransRequest里按照key value拼接生成用md5算法签名的。

关于加签验签一些基本的概念 可参考

juejin.cn/post/685457…

总结

1. 调用者引入我们的SDK,有一套请求模板,我们通过运营平台管理AppId、TermId、AppKey,把这些下发给调用者。

2. SDK对信息加密签名去请求我们的服务,服务端在进行解密验证签名进行相应的处理业务返回,返回时候再对信息进行签名加密。

3. SDK对返回的信息在进行解密验签返回给调用者是明文,整个过程中加密验证签名对用户是无感的。

4. 本质还是Http调用,对此我有些疑问为什么不用RPC调用。这一篇文章包含RPC、HTTP的具体区别讲解可参考 www.yuque.com/fcant/sys/w…

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring Boot统一对外开放接口设计,以下是一些常见的做法和建议: 1. 使用RESTful风格:采用符合RESTful规范的URL设计,使用HTTP动词来表示对资源的操作,如GET、POST、PUT、DELETE等,使接口易于理解和使用。 2. 版本管理:在URL中包含版本号,以便在接口发生变化时可以向后兼容,并且允许客户端选择使用哪个版本的接口。 3. 请求和响应格式:使用标准的JSON作为请求和响应的数据格式,以便不同平台和语言之间的交互更加简单和灵活。 4. 错误处理:定义统一的错误码和错误消息格式,使接口返回一致的错误信息,方便客户端进行错误处理。 5. 接口认证和授权:根据业务需求,选择适合的身份认证和授权机制,如基于Token的认证、OAuth2等,保护接口安全。 6. 参数校验:使用注解或工具对请求参数进行校验,确保参数的合法性和有效性。 7. 异常处理:统一处理接口层面的异常,将异常信息转换为友好的错误提示,并记录日志方便排查问题。 8. 接口文档:编写清晰、详细的接口文档,包括接口说明、参数说明、返回值说明等,方便开发者了解和使用接口。 9. 缓存和限流:根据实际情况,使用缓存和限流等机制提高接口的性能和可用性。 10. 单元测试和集成测试:编写测试用例,对接口进行单元测试和集成测试,确保接口的正确性和稳定性。 以上是一些常见的设计原则和建议,具体的设计还需要根据项目的实际需求和业务场景进行灵活调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值