itsdangerous的介绍
itsdangerous是python的第三方库,其内部是基于HMAC和SHA1进行数据加密的,是一种安全的基于加密hash函数和共享密钥的消息认证协议。其具体的内部实现机制我们这里不做深究,我们暂时可以把他理解为一种较为复杂且安全的对称型加密算法。
itsdangerous的使用场景
在当下的web编程中,对于安全的考量是决定web编程是否成功甚至合格的重要因素。而确实如此,当下随着移动互联网的普及与推进。web编程也做到了安全,比如我们的手机接收验证码进行账户验证的机制(属于非对称加密算法)。而在python的web编程或者通信中同样有着优秀的加密算法。
itsdangerous就是其中较为优秀的加密第三方库,其主要的应用场景就是我们的基于数字签名,数字令牌的加解密,简单的来说当你在开发web或者接口编程时你想把一串信息告诉对方,但你又不能确定对方的身份。itsdangerous则提供了简单的加密功能。
准备工作
首先保证你已安装了这个库,否则的话
pip install itsdangerous
具体使用
其实真正使用这个库的大多数是这个库的TimedJSONWebSignatureSerializer类,是不是感觉很长。从类名中我们也能看出 出现了json 和 time 这个类会有 时间和序列化的特性。其实它就是一个具有时间特性的序列化器。
数据加密
from itsdangerous import TimedJSONWebSignatureSerializer as Seria
secret_key = 'suijizifuchuan'
def encryption(expiration=60,**kwargs):
seria = Seria(secret_key,expiration)
ser = seria.dumps(kwargs)
return ser
定义了一个加密函数
其中secret_key 的值时随机的一组 字符串,我们可以把它理解为秘钥。expiration 为这个加密对象的过期时间
其输出结果如下图所示
输出结果
if __name__ == "__main__":
ser = encryption(id='123')
print(ser,"这是被加密的字符串")
其输出结果为一串字符串编码,可以看出这是一组bytes类型的数据,如需要的话可以通过encode函数把他转换为字符串使用。
下面对其进行解码
定义了解码的函数
解码函数
def decrypt(ser):
seria = Seria(secret_key)
res =seria.loads(ser)
return res
下面对其进行解码操作
if __name__ == "__main__":
ser = encryption(id='123')
print(ser,"这是被加密的字符串")
res = decrypt(ser)
print(res,"这是要被解密的字符串")
其运行结果如下所示:
测试多组参数
ser = encryption(id='123',name='zhangsan',sex='girl')
print(ser,"这是被加密的字符串")
res = decrypt(ser)
print(res,"这是要被解密的字符串")
可以看出,这个序列化器是支持多种参数的。
时间特性的验证
if __name__ == "__main__":
ser = encryption(expiration=1,id='123',name='zhangsan',sex='girl')
print(ser,"这是被加密的字符串")
time.sleep(2)
res = decrypt(ser)
print(res,"这是要被解密的字符串")
我们把过期时间定为两秒,这时候定义一个两秒的延迟
这时候则会报一个错误
最后优化
我们都知道bytes数据是不利于传播的,我们可以把他转化为字符串
再解密的时候再转为bytes类型
import time
from itsdangerous import TimedJSONWebSignatureSerializer as Seria
secret_key = 'suijizifuchuan' #这是秘钥,随机给的,加密和解密需要使用同一个秘钥
def encryption(expiration=60,**kwargs):
seria = Seria(secret_key,expiration)
ser = seria.dumps(kwargs).decode('utf-8')
return ser
def decrypt(ser):
seria = Seria(secret_key)
res =seria.loads(ser.encode('utf-8'))
return res
if __name__ == "__main__":
ser = encryption(id='123',name='zhangsan',sex='girl')
print(ser,"这是被加密的字符串")
time.sleep(2)
res = decrypt(ser)
print(res,"这是要被解密的字符串")