提高开放性 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 协议》,转载必须注明作者和本文链接
本帖由系统于 4年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

跟微信的方案类似,还可以加个随机数,用来标志只能请求一次

5年前 评论
streetlamp (楼主) 5年前

这个方案我们也在用。

5年前 评论
streetlamp (楼主) 5年前
jaak

传输数据时用 google 的 protobuf

5年前 评论
wanghan 5年前
jaak (作者) 5年前

前端组装加一个参数?

5年前 评论

用 base64 加密 好用不

5年前 评论
Jason 5年前
streetlamp (楼主) 5年前

嗯,不错学习了,哈哈

5年前 评论

可以再加上 redis,验证随机数,在某个时间段的可用次数。

5年前 评论
xiaoAgiao

使用成熟的开源网关系统不香嘛

4年前 评论

学到了 面试被问到 知道该怎么弄 思路没有答好

4年前 评论
streetlamp (楼主) 4年前