简记接口签名认证

案例说明

客户端:client
后台接口:api
client通过调用api获取用户信息

不做签名

api-url: http://localhost:8080/user?arg1=value1&arg2=value2

存在的问题

  1. 请求参数被篡改,会有问题
  2. 只要截获api-url,就可以不停的通过api查询用户信息

简单签名

api和client端,共享一份密码和一份MD5加密规则

Secret = "hhxxttxs"

MD5加密规则:
1、将请求的参数的参数名按照ASCII码排序
2、使用arg1=value&arg2=value&...&argn=valuen的方式拼接请求参数
3、将Sceret拼接在参数凭借的字符串后面
4、通过MD5加密生成一个加密串,规定加密后的大小写,例如全小写

就案例来说
加密前字符串:arg1=value1&arg2=value2hhxxttxs
加密后字符串:1ee04e0b1cb5af7367c80c22e42efd8b(假数据)

将加密字符串以sign的形式凭借在api-url中

api-url: http://localhost:8080/user?sign=1ee04e0b1cb5af7367c80c22e42efd8b&arg1=value1&arg2=value2

解决问题

请求参数被篡改不起作用
修改参数以后,后台按照MD5加密规则生成的加密字符串将会和sign携带的加密字符串不匹配,无法通过接口签名认证。

存在问题

接口可重复请求
如果有人截获了请求的api-url,虽然不能修改参数,但是可以直接用请求的api-url获取用户信息,并且可以一直用此api-url去获取。

改进签名

在简单签名的基础上修改MD5加密的规则,将timestamp也加入请求参数,并将其拼接在Secret后面

就案例来说
加密前字符串:arg1=value1&arg2=value2hhxxttxs1545818029
加密后字符串:1ee04e0b1cb5af7367c80c22e42efd8b(假数据)

按照简单签名的规则凭借api-url,并增加timestamp

api-url: http://localhost:8080/user?sign=1ee04e0b1cb5af7367c80c22e42efd8b&timestamp=1545818029&arg1=value1&arg2=value2

解决问题

接口唯一性调用
通过timestamp判断接口调用是否具有时效性,比如接口调用发起的3秒内请求是有效的,当请求到达后台以后,根据当前时间戳和携带的时间戳判断请求是否有效,只有有效的请求才应答,同时就算有人恶意截获了api-url,修改了时间戳也不行,因为生成MD5的加密规则他不知道,Secret他也不知道,所以没有办法修改sign,改其他的参数,后台生成的sign将和携带过来的sign不一致,接口验证会失败。

猜你喜欢

转载自blog.csdn.net/z_junyu/article/details/85266602
今日推荐