首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎么做开放API的签名认证

怎么做开放API的签名认证

作者头像
普通程序员
发布2019-10-23 11:46:25
1.5K0
发布2019-10-23 11:46:25
举报
文章被收录于专栏:普通程序员普通程序员

项目中有一套restful接口需要暴露在公网环境中,需要确保调用安全。包括以下三个方面

1、请求来源(身份)要合法

2、请求参数不能被篡改

3、请求要唯一(不可复制)

为了保证数据在通信时的安全性,可以采用参数签名的方式来进行相关验证。

一、不验证的方式

伪代码如下图

这种方式实现简单,但是问题非常明显,谁都可以得到想要的数据。

二、MD5参数签名

参看《MD5防止数据被篡改的做法》

我们对api查询产品接口进行优化

1.给app分配对应的key、secret

2.sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下

(1)按照请求参数名称将所有请求参数按照字母先后顺序排序得到,keyvaluekeyvalue...keyvalue 字符串如:将arong=1,mrong=2,crong=3 排序为,arong=1, crong=3,mrong=2 然后将参数名和参数值进行拼接得到参数字符串,arong1crong3mrong2

(2)将secret加在参数字符串的头部后进行MD5加密 ,加密后的字符串需大写。即得到签名sign

新api接口代码如下

这种方法请求多了key和sign参数,请求的时候就需要合法的key和正确签名sign才可以获取群组数据。这样就解决了身份验证和防止参数篡改问题。如果请求参数被人拿走,他永远也拿不到secret,因为secret是不传递的(客户端中病毒除外)。没有secrret无法伪造合法的请求。

但是这样还不够,如果获取你完整的链接,一直使用你的key和sign和一样的参数同样可以得到数据

三、请求唯一性保证

为了防止别人重复使用请求参数问题,我们需要保证请求的唯一性,就是对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的。

唯一性的实现:在如上的请求参数中,我们加入时间戳timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之一,也加入sign算法中进行加密

通过timestamp时间戳用来验证请求是否过期。这样就算被人拿走完整的请求链接也是无效的。除此之外,还可以增加浏览器指纹(后续单独写文章说明)等技术,对请求唯一性进行验证。

sign签名安全性分析

通过上面的例子,可以看出,安全的关键在于参与签名的secret,整个过程中secret是不参与通信的,所以只要保证secret不泄露,请求就不会被伪造。

上述的sign签名的方式能够在一定程度上防止信息被篡改和伪造,保障通信的安全,这里使用的是MD5进行加密,在实际使用中可以根据需求采用其他签名算法,比如:RSA,SHA等。

相关阅读

《一个海量在线用户即时通讯系统(IM)的完整设计》

《MD5防止数据被篡改的做法》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 普通程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档