数字签名

鉴权

数字签名一般是指通过鉴权来保证接口传输数据的安全性, 通过客户端密匙和服务端的密匙相匹配就是鉴权,例如签名钥匙sign = abc123,加上签名后,接口传输参数是:

http://xxxx:8090/?a=1&b=2&sign=abc123,但是明文传输sign参数是不安全的,所以要经过通过md5加密 。

所以,密匙跟着参数一起传输到服务器的。

MD5加密例子:

import hashlib

md5 = hashlib.md5()
sign_str = "abc123"       #定义一个字符串
sign_bytes_utf8 = sign_str.encode()

md5.update(sign_bytes_utf8)
sign_md5 = md5.hexdigest()          #md5加密
print(sign_md5)

数据防篡改

将整个接口参数生成加密字符串,安全性更高,只是所谓的全参加密,但是全参加密也有弊端,因为MD5是不可逆的,服务器也必须知道接口的参数值才能MD5加密验证,否则验证失败。一般接口设计时对客户端请求参数并不知道。一般不用全参加密。

在接口开发过程中,一般通过时间戳+sign作为密匙加密传输。

这种情况测试接口时,通过获取时间戳和拿到sign密匙后,再拼接成一个字符串,再加密这个字符串,然后和参数一起传输。

MD5时间戳和sign的例子:

import hashlib  # MD5加密
import time

sign_key = 'asd123'  # key 作为密钥

now_time = time.time()  # 获取当前时间 这里获取的是从1970年1月1日0时0分0秒到现在度过的秒
c_time = str(now_time).split('.')[0]  # 获取.之前的时间戳
sign = c_time + sign_key  # 拼接成一个字符串

md5 = hashlib.md5()

sign_bytes_uft8 = sign.encode(encoding='utf-8')   #进行UTF-8编码
md5.update(sign_bytes_uft8)
sign_md5 = md5.hexdigest()      #md5加密

print(sign_md5)

当前时间戳+key加密后,就可以作为参数直接传输了