在以SpringBoot开发后台API接口时,会存在哪些接口不安全的因素呢?通常如何去解决的呢?本文主要介绍API 接口有不安全的因素 以及 常见的保证接口安全的方式 ,重点 实践如何对接口进行签名 。@pdai
- SpringBoot接口 - API接口有哪些不安全的因素?如何对接口进行签名?
准备知识点
建议从接口整体的安全体系角度来理解,比如存在哪些不安全的因素,加密解密等知识点。
API接口有哪些不安全的因素?
这里从体系角度,简单列举一些不安全的因素:
- 开发者访问开放接口
- 是不是一个合法的开发者?
- 多客户端访问接口
- 是不是一个合法的客户端?
- 用户访问接口
- 是不是一个合法的用户?
- 有没有权限访问接口?
- 接口传输
- http明文传输数据?
- 其它方面
- 接口重放,上文介绍的接口幂等
- 接口超时,加timestamp控制?
- ...
常见的保证接口安全的方式?
针对上述接口存在的不安全因素,这里向你展示一些典型的保障接口安全的方式。
AccessKey&SecretKey
这种设计一般用在开发接口的安全,以确保是一个 合法的开发者 。
- AccessKey: 开发者唯一标识
- SecretKey: 开发者密钥
以阿里云相关产品为例
认证和授权
从两个视角去看
- 第一: 认证和授权 ,认证是访问者的合法性,授权是访问者的权限分级;
- 第二: 其中认证包括 对客户端的认证 以及 对用户的认证 ;
- 对于客户端的认证
典型的是AppKey&AppSecret,或者ClientId&ClientSecret等
比如oauth2协议的client cridential模式
https://api.xxxx.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
grant_type参数等于client_credentials表示client credentials方式,client_id是客户端id,client_secret是客户端密钥。
返回token后,通过token访问其它接口。
- 对于用户的认证和授权
比如oauth2协议的授权码模式(authorization code)和密码模式(resource owner password credentials)
https://api.xxxx.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID&scope=read
grant_type参数等于password表示密码方式,client_id是客户端id,username是用户名,password是密码。
(PS:password模式只有在授权码模式(authorization code)不可用时才会采用,这里只是举个例子而已)
可选参数scope表示申请的权限范围。(相关开发框架可以参考spring security, Apache Shiro, SA-Token 等)
https
从接口传输安全的角度,防止接口数据明文传输, 具体可以看 这里
HTTP 有以下安全性问题:
- 使用明文进行通信,内容可能会被窃听;
- 不验证通信方的身份,通信方的身份有可能遭遇伪装;
- 无法证明报文的完整性&#