web接口之数字签名
什么是数字签名
所谓数字签名(Digital Signature)(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,
但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用
于签名,另一个用于验证。
数字签名的实现
数字签名的简单实例是直接利用RSA算法和发送方的秘密密钥。对被签名的数据进行加密。当接收方收取本块
密文时,使用发送方的公开密钥进行解密,如果能够还原明文,则根据公开密钥体制的特点(公开密钥加密的密文
只能用秘密密钥解密,秘密密钥加密的密文只能用公开密钥解密),可以认为该数据确实来自于希望的发送方。
接口测试中的数字签名
在使用HTTP/SOAP协议传输时,签名作为其中一个参数,起到鉴权的作用(客户端的密匙和服务端的密匙匹配)
以及数据防篡改(参数是明文传输,将接口参数及密匙生成加密字符串,将加密字符串作为签名),因为对整个接
口的参数进行了加密,因此任何一个参数发生变化那么签名验证及失败。
弊端: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加密后,就可以作为参数直接传输了