itsdangerous加解密源码分析|BUG汇总

这是我这两天的思考

早知道密码学的课就不旷那么多了

纯个人见解

如需转载,标记出处

目录

一、官网介绍

二、事例代码

源码分析:

加密函数dump源码使用的函数如下:

解密

​编辑

​编辑

关于签名:

为什么这个数字签名没有用非对称?

二、itsdangerousBUG汇总

[1.ImportError: cannot import name 'TimedJSONWebSignatureSerializer' from 'itsdangerous'](#1.ImportError: cannot import name ‘TimedJSONWebSignatureSerializer‘ from ‘itsdangerous‘)

原因:

[解决方法一:降级 itsdangerous 到 1.1.0(我自己用的这个)](#解决方法一:降级 itsdangerous 到 1.1.0(我自己用的这个))

[解决方法二:使用 URLSafeTimedSerializer 替代](#解决方法二:使用 URLSafeTimedSerializer 替代)


一、官网介绍

ItsDangerous --- ItsDangerous Documentation (2.2.x)

有时,你需要将一些数据发送到不受信任的环境,再将其取回。为了安全,必须对数据进行签名以检测更改。

有了只有你知道的密钥,你就可以对数据进行加密签名并将其交给其他人。取回数据时,可以确保没有人篡改它。

接收方可以看到数据,但除非他们也有你的密钥,否则无法改数据。

必须将密钥保密且复杂

安装

pip install -U itsdangerous

二、事例代码

只截取部分分析代码

1.加解密工具

python 复制代码
#加密
def generic_openid(openid):

    s = Serializer(secret_key=settings.SECRET_KEY, expires_in=3600)
    access_token = s.dumps({'openid': openid})

    # 将bytes类型的数据转换为 str
    return access_token.decode()

# 解密
def check_access_token(token):
    s = Serializer(secret_key=settings.SECRET_KEY, expires_in=3600)
    try:
        result=s.loads(token)
    except Exception:
        return None
    else:
        return result.get('openid')

2.功能(判断用户是否绑定,如果没有绑定,hash加密openid生成token给前端,前端收集用户填写的信息,传输时把用户信息+token一起传递给后端

python 复制代码
#根据openid进行查询判断用户是否已经绑定
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 不存在
            # 5. 如果没有绑定过,则需要绑定

            access_token = makeToken(openid,3600)
            #前端拿着这个凭证去进行绑定
            response = JsonResponse({'code': 400, 'access_token': access_token})
            return response
        else:
            # 存在
            #如果绑定过,则直接登录

我认为这里的token是一个hash算法生成的签名+原数据的拼接,它在前端解不开,只能在我的后端解开,这个功能就是为了给前端一个通行证,你可以把自己的用户信息比如邮箱绑定发给我,我后端根据返回来的token来验证是否这个绑定是我想给的用户本人。全程只使用一个密钥加解密,也就是对称加密

源码分析:

加密函数dump源码使用的函数如下:

dump做了两个主要工作,创建头部,生成签名

他在头部里放了这个签名有了什么算法(这里用的是默认算法,HS512)

make_signer 函数生成一个签名者对象(signer)。根据当前的 secret_key以及其他salt、algorithm来返回一个用于签名的实例

对传入的数据进行签名,返回拼接了签名的数据字符串(原始数据 + 分隔符 + 签名)

want_bytes格式化字符串,将其编码成字节

解密

这里先使用make_signer()函数获取验签用的算法

重点是这个unsign函数

它对签名过的数据进行验签,返回原始数据

signed_value: 已签名的数据= 原始数据 + 分隔符 + 签名

先判断签名格式。如果签名被篡改(格式不对),捕获异常并返回 False

将拆分下来的数据openid生成新的签名,将原先的签名和新的作比较看是都相同

关于签名:

我以为的数字签名是使用的非对称加密,我给一个文件用私钥加密做签名,传输签名+明文,别人拿我的公钥去解开查看,对比旁边的明文看受否是我本人的。但这里使用的密钥为同一个,它的加密也只是对称加密。

至此我想我应该解释清楚了整个过程,在这个学习过程中,我也生出了很多疑问,

为什么这个数字签名没有用非对称?

经过两天的思考我得到了如下的答案

itsdangerous 的主要场景只需服务端自签自验,无需公钥体系。对称加密(如 HMAC)更快、更简单。非对称签名复杂、慢、密钥管理重,反而不适合它的简单签名校验场景。

二、itsdangerousBUG汇总

1.ImportError: cannot import name 'TimedJSONWebSignatureSerializer' from 'itsdangerous'

之前都正常导入

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer

今天importerror

原因:

itsdangerous 库在高版本中已经移除了 TimedJSONWebSignatureSerializer,所以导致导入失败。

TimedJSONWebSignatureSerializer 是 itsdangerous 早期版本的 API,用来生成带有效期的 token。从 itsdangerous 2.0 开始,这个类被 移除或不推荐使用 ,官方推荐使用其他方式生成/验证 token(如 URLSafeTimedSerializer)。

解决办法:

解决方法一:降级 itsdangerous 到 1.1.0(我自己用的这个)

降级 itsdangerous:

python 复制代码
pip install itsdangerous==1.1.0

解决方法二:使用 URLSafeTimedSerializer 替代

如果不想降级,改用推荐的新写法:

python 复制代码
from itsdangerous import URLSafeTimedSerializer 
# 初始化 
serializer = URLSafeTimedSerializer(secret_key='your-secret-key') 
# 生成 
token token = serializer.dumps({'user_id': 123}) 
# 验证 
token try: data = serializer.loads(token, max_age=3600) 
# 3600秒有效期 
print(data) 
except Exception as e: 
print('Token 验证失败:', e)
复制代码
相关推荐
安 当 加 密2 个月前
【安当产品应用案例100集】034-安当KSP支持密评中存储数据的机密性和完整性
数据安全·加密系统·数字签名·密钥管理·透明加密·加密技术
阿达_优阅达4 个月前
常见问题 | 数字签名如何保障电子商务交易安全?
安全·企业数字化转型·数字签名·合同管理·协议管理
racent锐成信息6 个月前
代码签名证书如何为软件签名?代码签名证书签名指南
数字签名·软件安全·代码签名证书·代码签名·软件数字签名
闲人编程6 个月前
Python 实现 SHA-1 数字摘要签名算法
开发语言·python·算法·密码学·加解密·数字签名·sha
火柴盒zhang7 个月前
OFD板式文件创建JAVA工具-EASYOFD
java·图像·字体·ofd·数字签名·板式文件·数字签章
我想学LINUX8 个月前
【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)
linux·算法·哈希算法·hash·数字签名·md5算法·单项列表函数
bcbobo21cn10 个月前
数字签名学习
加密·数字签名
Amd7941 年前
RACE IPEMD:构建安全基石的密码学原理与实践
哈希算法·安全分析·数字签名·sha-1·消息摘要·sha-2/3·ipemd
Racent_Y1 年前
支持S/MIME证书的邮件客户端有哪些?
安全·数字签名·数字证书·邮件安全·s/mime证书·邮件加密