提高开放性 API 接口的数据安全性的个人一些见解,欢迎补充!
哈喽大家好,好久没更新博客了,今天我们来谈谈开放性api接口的数据安全问题。
背景分析
app 客户端请求后台服务这样的开发模式都是很常见的,这样就导致了我们后台的服务接口暴露在外网,任何人都可以来请求访问,甚至很多不怀好意的人会通过这些接口窃取一些信息来做一些违法的事情。如果有一个接口是获取用户信息的,但是这个接口没有任何验证机制和机密措施,别人就可以随便调用该接口获取用户信息,甚至可以模拟参数获取其他用户的信息。所有今天我们来说说怎么能够把开放性接口做的更安全一点。
解决方案
方案一
一、步骤
- 1、我们可以学习微信,阿里云,腾讯等这些大公司的一些做法,给每个客户端分配一个appid和一个secret密钥。
- 2、然后在发起请求之前,把请求参数按照字母的先后顺序排序后得到一个:key=value,key1=value1的字符串。例如:http://www.baidu.com?b=1&d=9&a=2 ,把参数排序后的顺序为a=2,b=1,d=9。然后将这些参数按照一定的规则拼接成一个字符串,如a2b1d9。
- 3、把secret拼接到参数字符串的头部或尾部进行MD5加密,得到的加密字符串就是sign签名,可以放到请求链接上传送到后端进行验证。
- 4、请求链接就变为http://www.baidu.com?b=1&d=9&a=2&appid=appid&sign=sign签名 。注意:secret千万不要暴露在请求链接上,不然被劫持后如果对方猜出你的拼接规则和加密方式,就能够破解你链接上的签名了。
- 5、后台服务接受到请求后通过appid去获取到对应的secret值,然后跟客户端一样的规则生成签名,把这个签名和客户端传送过来的进行对比,如果是一样那就证明是合法的请求。
二、效果
通过加入一个secret和一个sign签名,一下子解决掉了身份验证和防止请求参数被篡改的问题,如果请求被拦截修改参数后该请求就会变成非法请求。如果伪造appid,后端无法通过无效appid获取secret,该请求也无法通过验证。
三、不足
如果被第三方获取到了完整的请求链接,一直使用合法的appid和sign签名发起请求,也是能够正常获取到数据的。
方案二
一、改进
在方案一的基础上我们加入一个参数,发起请求时的时间戳。只有我们把这个时间戳也加入到sign算法中进行加密,然后再请求链接上也加上这个时间戳,后端就能够通过这个时间戳进行判断,用当前时间的时间戳减去传过来的时间戳,如果大于一个值也拒绝这个请求。如果别人获取到这个链接也只能再这段时间内能请求,超时后就不能请求了。
谢谢观看!
streetlamp 敬上!
本作品采用《CC 协议》,转载必须注明作者和本文链接
跟微信的方案类似,还可以加个随机数,用来标志只能请求一次
这个方案我们也在用。
传输数据时用google的protobuf
前端组装加一个参数?
用base64 加密 好用不
嗯,不错学习了,哈哈
可以再加上redis,验证随机数,在某个时间段的可用次数。
使用成熟的开源网关系统不香嘛
学到了 面试被问到 知道该怎么弄 思路没有答好