开放 API 接口安全设计思路

开放API接口安全校验的背景:
在未进行安全处理的开放 API 接口存在诸多的风险问题,如以下三种常见场景:

1、场景一
A 公司开发的开放 API 未对接口进行安全控制,有黑客通过爬虫程序调用开放 API 查询客户信息的接口,由于没有安全验证,A 公司的客户数据通过客户信息查询 API 流出,竞争公司拥有了这批客户数据,对 A 公司造成损失。

2、场景二
A 公司开发的开放 API 未对接口进行防篡改控制,有客户购买价值 1 万元的产品,现有黑客通过技术手段,对客户提交的表单进行篡改,将 1 万元的价格改成 100 元,对公司造成了经济损失。

3、场景三
A 公司开发的开放 API 未进行接口安全控制,有黑客截取了客户的用户名,密码信息。黑客用客户的用户名,密码登录,查阅客户的相关隐私信息,盗刷了客户的信用卡,给客户造成了损失。

这三种常见未进行开放 API 接口校验的场景对公司以及客户造成损失的都是不可修补的,也反映了普遍开放式 API 接口存在的安全问题。那么,在编写开放 API 接口时如何保障数据传输安全性?

开放API接口安全性需要考虑的事项总结如下:
1、请求来源(身份)是否合法?
2、请求参数是否被篡改?
3、请求的唯一性(不可复制、DDOS)?

思路:
一、参数签名校验

1、接口调用方和接口提供方约定好统一的参数加解密算法
2、密钥:初始密钥(内置各应用中)、token授权密钥(从服务端获取生成,根据用户名密码或header请求头信息生成token),共同形成最终的secret通信密钥。
3、对所有需要发送的参数按特定规则进行排序,如升序
例:b=2&a=1&c=3×tamp=1533095588 排序后 a=1&b=2&c=3×tamp=1533095588
4、将排序后的参数名和参数值拼接连接为字符串
例:a1b2c3_timestamp1533095588
5、将参数与secret通信密钥混合加密生成签名字符串,(然后对加密后的字符串进行urlencode处理)
例:sign=amhIEWlsG0rVhg4ffRyfssF1Aff03cu6C6ERkFv2nDlKv811jGfWqFKrE2am0Ue7fRhFdTWHdP9uEfisgHHQNY3pTn0hkq0E5R2m4x4xKKM%3D
二、请求唯一性校验
放了防止重复使用请求参数问题,需要对请求参数进行相对唯一性校验,这样就算别人拿走了请求的完整链接也是无效的。这里对唯一性的实现:在如上的请求参数中,我们加入时间戳 timestamp,同样,时间戳作为请求参数之一,也加入sign算法中进行加密。
三、HTTPS协议支持
接口提供方校验:
1、sign签名字符串与参数校验通过接受本次请求
2、时效合法性判断通过接受本次请求(时间戳,这个时间间隔根据你的安全范围可以是10分钟,5分钟,20秒等,过期失效,前提是需要保证接口提供方和调用方的服务器时间为准确的网络同步时间)
PS:Sign签名安全性分析
以上校验形式,可以看出安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,所以只要保证secret不泄露,请求就不会被伪造。
推荐阅读本博客AES加解密类文章
其他补充:
同时,可以基于成熟的redis或memcache方案记录接口的日IP访问数据,做到合理科学的评估每日接口的正常请求次数及黑名单处理。

你可能感兴趣的:(API接口)