验签:
背景:
在实际工作中,有些敏感接口如支付接口,接口定义了一个入参为auth,在请求接口时,必须传入正确的auth,接口才会返回正确的数据,否则不处理,目的是为了加强接口的安全性
原理:
每次发送请求时都需要携带一个参数,可能是header里面传,也可能是在body里面,一般定义名为auth
根据提供的算法,生成一个签名,每次请求的时候带上这个签名,后端验证签名通过后,这个请求才会被处理,否则不处理这条请求
例子:
使用fastapi本地mock一个接口
import fastapi import uvicorn import hashlib server = fastapi.FastAPI() salt = 'ssz-abc' @server.post('/api/test') def test(name:str,addr:str,phone:str,auth:str): s = '%s%s%s%s'%(name,addr,phone,salt) s = hashlib.md5(s.encode()).hexdigest() print(s) if auth == s: return {"code":0,"msg":"操作成功","name":name,"addr":addr,"phone":phone,"auth":auth} else: return {"code":-1,"msg":"验签失败"} if __name__ == '__main__': uvicorn.run('验签:server',port=9000,host='0.0.0.0',debug=True)
当使用postman请求时,如果auth与算法生成的结果不一致,则不会处理这条请求
加密:
背景:实际工作中,有些接口不希望被其他人读懂入参和出参报文,经常会将参数使用加密后的数据来传递入参,比如常用的AES加密,加密和解密使用不同的密钥
原理:每次请求传过来的都是一个加密字符串,1.先知道加密的算法是什么 2.每次发请求之前,都把参数加密
#pip install pycrypto from Crypto.Cipher import AES from binascii import b2a_hex, a2b_hex import fastapi server = fastapi.FASTAPI() class Prpcrypt(): def __init__(self, key): ''' :param key:security_key,一个16位的随机字符串,不要让别人知道 ''' self.key = key.encode() # 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数 def encrypt(self, text): text = text.encode() cryptor = AES.new(self.key, AES.MODE_CBC, self.key) # 生成一个加密对象 # 这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用 length = 16 count = len(text) if count % length != 0: # 判断加密的字符串长度是不是16的倍数 add = length - (count % length) # 如果不是的话,就在前面补多少个/0, 这里的算法是 # 举例:53/16 商3 余5; 16-5 = 11, 53+11 = 64 ;,64是53上面最小的一个16的倍数 # 53是加密内容的长度,不是16的倍数,通过 16 - (53 % 16 ) 算出需要补多少个/0,加密内容的长度才是16的倍数 else: add = 0 text = text + (b'