给第三方使用接口的 URL 签名实现

在开放给第三方使用的API中,如果让第三方携带明文的token请求服务,极有可能泄漏token。由于第三方身份验证服务器是依赖于token的,这样会造成不良的后果。为了提高通信的安全性,我们需要加密token,就是URL签名了。

实现URL的签名过程

  1. 生成URL签名的signature,假设第三方获取到token后,token=“aff9u87kkk444hjg”,openId=8996,将要调用的API路径是zithan.test/user/show,那么URL签名如下:

    signature=md5('zithan.test/user/show?openId=8996&token=aff9u87kkk444hjg')
  2. 组合API的路径

    zithan.test/user/show?openId=8996&signature=1aba61306711521e8b52ac2f46bb3ebf
  3. 但是现在还有一个问题,就是重放攻击,没有过期时间,假设非法者截获了这个API路径,就能反复调用这个路径。 改进方法是增加时间戳,增加API路径的时效性。

    signature=md5('zithan.test/user/show?openId=8996&token=aff9u87kkk444hjg&timestamp=1550732083')
zithan.test/user/show?openId=8996&timestamp=1550732083&signature=cba2aa328577e6aab3e811517e1aa752

注意事项

  1. md5可以换成其他非对称加密的方法
  2. 在获取token那一个步骤也有可能泄露token,那么严谨就需要采取对称加密,进行数据加密。
  3. 因为增加了时间戳,那么就有可能导致第三方和服务器的差异性,那么就需要计算第三方的时间差,在验证签名或者生成签名的时候考虑进去。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
GDDD

这样搞用在哪?

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!