聊聊 API 签名方式.md

前言

现在越来越多的公司以 API 的形式对外提供服务,这些 API 接口大多暴露在公网上,所以安全性就变的很重要了。最直接的风险如下:

因此需要设计一些接口安全保护的方式来增强接口安全,在运输层可添加 SSL 证书,上 HTTPS,在应用层主要是通过一些加密逻辑来实现。目前主流的两种是在 HTTP Header 里加认证信息和 API 签名。

HTTP 简单身份认证

在 HTTP 请求的 Header 中添加认证字段例如:

Authorization: 3F2504E04F8911D39A0C0305E82C3301

服务器处理前取出该字段进行校验即可。

Spring Boot 项目直接实现一个拦截器就可进行判断:

这类方法实现比较简单,可以做基本的身份认证,防君子不防小人,可通过中间人攻击获得 Authorization。使用 HTTPS 安全性会得到提高,但是无法抵御重放攻击造成的影响,例如 DDOS。

API 签名认证

API 签名的方式较前一种要复杂的多,但是可解决的安全问题也更多:

part1:请求端加密

API 使用者会获取到服务器颁发的 ak 和 sk 两个秘钥,ak 为公钥,sk 为私钥。

签名有以下规则:

1.约定请求时会携带 ak 作为参数并放入 HTTP Header。 2.请求参数处理: GET:取出所有的参数,并根据 key 进行字典排序,拼装成如下格式。 POST:如果是 application/x-www-form-urlencoded,直接取出和 GET 参数进行排序拼接,如果是 application/json,则直接将整个 json 串 md5 加密后再 base64。

3.使用 HmacSHA256 算法,传入 sk 进行签名计算,sign = base64(HmacSHA256(K,strToSign)),其中K=sk。 4.组装 HTTP 请求,将 X-Ca-Key=ak,X-Ca-Signature=sign 添加到 HTTP Header 中进行请求。

一个简单实例如下图所示:



part2:服务端解密

同样的,服务端获取到请求的 ak 后,查询出对应的 sk,使用相同的规则进行签名计算,计算出的 sign 和传入的 sign 比对,就能够知道参数是否被篡改。

经过这样签名方式后,可以保证上文提到的,校验请求者的合法性和校验参数的完整性和是否被篡改。但是如果有人施加一个中间人攻击,就可以获取到请求报文,即便攻击者无法破译出签名规则,也可以将请求重放,也就是原封不动提交给服务器,那么如果发起恶意大规模攻击,就会使服务器产生拒绝服务。

更进一步

如果需要的安全性更高,可以采用 timestamp 和 nonce 来解决这个问题。

单一使用 timestamp,可以一定程度上减少重放攻击的频率,但是无法完全遏制。

单一使用 nonce,咋一眼看可以保证请求的唯一性,但实际上服务端,随着时间推移服务端无法存储大量的 nonce,需要进入淘汰环节,一旦旧的 nonce 被淘汰,那么攻击者依旧可以卷土重来进行重放攻击。

因此,将两者结合一起来就是最终的方案,服务端首先验证 nonce 是否存在,再校验时间戳是否在规定的期限内。如果旧 nonce 被清理,也有时间戳进行把关,使得请求无法被重放。

part1:请求端生成 timestamp 和 nonce

生成时需要保证短时间内生成 nonce 的唯一性。

将 timestamp 和 nonce 写入 HTTP Header 中。

part3:服务端校验

1.数据库查询请求带上的 nonce 是否存在(推荐使用Redis,自带TTL功能)。 2.如果不存在,且请求时间有效则为合法请求,同时将 nonce 写入,并记录时间;如果不存在,且请求时间超出规定时限,判断为恶意请求。 3.如果已经存在,判断为恶意请求。

做足以上这几部基本上已经可以保证一定的安全性。当然还有更复杂的,可以阅读阿里的 Open API 签名文档,根据项目自身对于安全性的需求可以适当进行简化。本文讲到的基本逻辑就是根据阿里的来的。

API 签名与 HTTPS

这边还想提一下 HTTPS。之前看到一则知乎上的提问: 使用了 https 后,还有必要对数据进行签名来确保数据没有被篡改吗?

总结一下就是:

总结

本文主要介绍了当前主流 API 签名方式,可以根据项目场景去挑选组合合适的方案。

博客还附带实现了一个根据上文规则描述的工具类,可以用于API签名,可见下面源码链接。如果需要使用 timestamp 和 nonce 的可在此基础上将这两个字段添加到 sortedMap 中一起拼接,并集成Redis。

源码

哆哆女性网城市规划设计好的网站慈溪专业网站建设公司北流网站优化苏州优化网站关键词妍取名起名大全公司起名用什字seo優化手机网页设计网站体育科技公司起名安阳网站设计民权葡萄酒产地周公解梦大全查询2345梦见水网站设计郑州商丘灌浆料御前美人永城永城阳seo阮起什么名字请问起婚车租赁公司什么名称好不成问题的问题百度云网上购物商城网站建设庞然大物的意思企业营销型网站制作公司网站原型图设计工具古代的鬼故事056护卫舰属狗宝宝起名能用字宣传片策划方案2021年周公解梦大全查询常熟网站制作哪家好淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化