开放接口安全设计,LOOK!
一、前言
今早在看到一篇文章介绍的是接口安全问题,这让我想到了以前给第三方平台开放接口调用的一个需求,现将如何实现开放接口安全记录一下~
接口就是接口,要啥安全呢?需要啥参数需要啥种请求照做不就完事了吗...安全不是多此一举吗!NONONO!答案却正正与之相反哦!打个比方叭:每个人家里都会有锁🔒,而接口安全就等于门锁,没有接口安全的设计,就等于任意人都随便进出你家!特别是给第三方调用的这些开放接口,要是没有考虑到接口安全的问题,别有用心的人就.....话不多说!进入正题吧!📣
二、加密算法
要了解开放接口安全设计,得先了解啥是加密算法!
加密算法主要分为以下几种:
- 对称加密算法(AES、DES、3DES)
- 简介:对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)
- 优点:加密速度快
- 缺点:密钥的传递和保存是一个问题,参与加密和解密的双方使用的密钥是一样的,这样密钥就很容易泄露
- 非对称加密算法(RSA、DSA、ECC)
- 简介:非对称加密算法是指加密和解密采用不同的密钥(公钥和私钥),因此非对称加密也叫公钥加密,是可逆的(即可解密)。
- 优点:加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从而降低了被破解的几率。
- 缺点:加密速度慢
- PS:RSA加密算法既可以用来做数据加密,也可以用来数字签名。
- 数据加密过程:发送者用公钥加密,接收者用私钥解密(只有拥有私钥的接收者才能解读加密的内容)
- 数字签名过程:甲方用私钥加密,乙方用公钥解密(乙方解密成功说明就是甲方加的密,甲方就不可以抵赖)
- 线性散列算法算法(MD5、SHA1、HMAC)
- MD5:MD5是单向的算法不可逆(也就是被MD5加密的数据不能被解密)。MD5加密后的数据长度要比加密数据小的多,且长度固定,且加密后的串是唯一的。
- SHA1:SHA-1摘要比MD5摘要长32 位,所以SHA-1对强行攻击有更大的强度,比MD5更安全。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是 2^128 数量级的操作,而对SHA-1则是 2^160 数量级的操作。在相同的硬件上,SHA-1 的运行速度比 MD5 慢。
- 混合加密
- 简介:对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)
- PS:RSA+AES
- 优点:采用RSA加密AES的密钥,采用AES对数据进行加密,这样集成了两种加密算法的优点,既保证了数据加密的速度,又实现了安全方便的密钥管理。
三、开放接口的实现
基本思路:给需要调用接口的第三方下发appId+appSecret,平台本地保留第三方的appId+appSecret。
第三方:调用接口时,带上appId+sign+data
- appId:平台下发的appId
- sign:appSecret+data 根据加密算法生成数字签名
- data:参数
平台方:
- API层配置统一路径开头 (ps:/open)
- 自定义拦截器,拦截/open开头请求(若项目中集成Shiro或SpringSecurity记得为开放接口配置白名单)
- 拦截器中判断请求中是否携带所需参数appId+sign+data
- 根据appId查询appSecret,再利用appSecret+data根据加密算法生成数字签名
- 判断本地生成的sign与请求中的sign是否一致,一致则放行
四、签名生成
签名参考:https://gitee.com/durcframework/easyopen
1. 将请求参数按参数名升序排序;
2. 按请求参数名及参数值相互连接组成一个字符串:<paramName1><paramValue1><paramName2><paramValue2>...;
3. 将应用密钥分别添加到以上请求参数串的头部和尾部:<secret><请求参数字符串><secret>;
4. 对该字符串进行MD5运算,得到一个二进制数组;
5. 将该二进制数组转换为十六进制的字符串(全部大写),该字符串即是这些请求参数对应的签名;
6. 该签名值使用sign参数一起和其它请求参数一起发送给服务开放平台。
五、总结
本次所讲的开放接口安全只是其中一种解决办法,还有更好的方法也欢迎小伙伴在评论区留言~😉

浙公网安备 33010602011771号