参考:
接口的安全性主要围绕Token、Timestamp、sign三种机制开展,保证接口的数据不被篡改和反复调用。
1、Token授权机制:Client使用用户名、密码成功登录后,Server返回给Client一个Token,并将Token-UserId以键值对的形式存放在缓存服务器上。Server接收到请求Request后进行Token验证,若Token不存在或不正确,则请求Request无效。2、时间戳超时机制:Client每次请求都带上当前时间的时间戳timestamp,Server接收到timestamp后跟当前时间比对,若二者时间差大于一定时间,则认为该请求无效。时间戳超时机制是防御DDOS攻击的有效手段。3、Sign签名机制:将口令Token、时间戳、加上其他请求参数,再用MD5或SHA-1算法加密,加密后的数据就是本次请求的签名sign;Server收到请求Request后以同样的算法得到签名,并跟当前的签名比对,若不同,则说明参数被更改过,请求非法,直接返回错误标识。签名机制保证了数据不会被篡改。
web页面要调用接口,需要使用几个参数生成签名:
时间戳timestamp:当前时间
随机数salt:随机生成的随机数
口令key:前后台开发时,一个双方都知道的标识,相当于暗号
算法规则:商定好的运算规则,上面三个参数可以利用算法规则生成一个签名sign。
原理:web页面调用接口时,把时间戳、随机数、生成的签名通过url传递到后台,后台拿到时间戳、随机数之后,通过一样的算法规则计算出签名,与传递来的签名比对,一样的话返回给web页面数据。
安全的关键在于生成签名的口令key,整个过程中key是不参与通信的,所以只要保证key不泄露,请求就不会被伪造。
接口:http://api.test.com/getproducts?timestamp=201603261407&salt=267485898&sign=BCC7C71CF93F9CDBDB88671B701D8A35 或者将参数存在请求头header里
约定的算法规则:
1、时间戳、随机数、口令依次拼接成字符串
2、进行sha1加密再进行MD5加密
3、转大写,生成签名
代码:
import time
import uuid
import hashlib
class Sign(object):
"""
生成签名的算法规则:
1、时间戳、随机数、口令依次拼接成字符串
2、进行sha1加密再进行MD5加密
3、转大写,生成签名
双方只需要私下定好口令key就可以了。时间戳、随机数可以以url参数?time_stamp=11112&salt="yyyyy"&sign="2323fhfgsh"这种方式传给我,也可以以请求头的方式传给我,口令不得出现在请求request中
"""
key = "DSM-CTDI"
def __init__(self, time_stamp, salt):
self.time_stamp = time_stamp
self.salt = salt
def create_str(self):
return " ".join([str(self.time_stamp), self.salt, self.key])
def signature_create(self):
strs = self.create_str()
signature_sha1 = hashlib.sha1(strs.encode('utf-8')).hexdigest() # 40位的16进制字符串
signature = hashlib.md5(signature_sha1.encode('utf-8')).hexdigest() # 32位的16进制字符串
return signature.upper()
sign = Sign(int(time.time()), str(uuid.uuid1()))
signature = sign.signature_create()
print(signature) # F55A6E88D1FC3D7A814DE65F4833DD2D
是否考虑将响应内容加密传输