itsdangerous数据签名
itsdangerous是一个对数据进行加密签名的三方模块,保证数据的安全,默认使用HMAC和SHA-512进行签名
TimedJSONWebSignatureSerializer基本使用方法:
TimedJSONWebSignatureSerializer是JSON Web时间戳签名,签名后的格式个JWT的三段格式类似
- 1.创建TimedJSONWebSignatureSerializer对象
- 2.使用dumps()序列化和对数据签名
- 3.使用loads()来验证签名和反序列化的数据代码示例(对QQ授权登录的openid签名)
对数据序列化和数据签名的方法
def generic_access_token(data):
# 创建序列化器
# 参数一:密钥,使用工程密钥
# 参数二:时间戳
serializer = Serializer(settings.SECRET_KEY,3600)
# 进行序列化和数据签名
token = serializer.dumps({'data':data}) # byte类型
# 返回数据
return token.decode()
对数据反序列化和验证签名的方法
def check_data(token):
# 序列化器
serializer = Serializer(settings.SECRET_KEY, 3600)
# 反序列化和验证签名
try:
result = serializer.loads(token)
except BadSignature:
return None
else:
return result.get('data')
salt加盐
若要签名的内容相同,就需要进行加盐,即起一个别名,和Django的空间命名spacename类似
- 代码示例
from itsdangerous.url_safe import URLSafeSerializer
签名加盐
s1 = URLSafeSerializer("secret-key", salt="activate")
s1.dumps(42)
>>>'NDI.MHQqszw6Wc81wOBQszCrEE_RlzY'
s2 = URLSafeSerializer("secret-key", salt="upgrade")
s2.dumps(42)
>>>'NDI.c0MpsD6gzpilOAeUPra3NShPXsE'
第二个序列化程序无法加载第一个序列化程序转储的数据,因为盐不同:
s2.loads(s1.dumps(42))
>>>报错:Traceback (most recent call last):
...
>>>itsdangerous.exc.BadSignature: Signature "MHQqszw6Wc81wOBQszCrEE_RlzY" does not match
只有具有相同salt的序列化程序才能加载数据:
s2.loads(s2.dumps(42))
>>>42