当前位置: 首页 > news >正文

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

这是我这两天的思考

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

纯个人见解

如需转载,标记出处

目录

一、官网介绍

二、事例代码

源码分析:

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

解密

二、itsdangerousBUG汇总

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

原因:

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

解决方法二:使用 URLSafeTimedSerializer 替代


一、官网介绍

ItsDangerous — ItsDangerous Documentation (2.2.x)

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

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

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

必须将密钥保密且复杂

安装
pip install -U itsdangerous

二、事例代码

只截取部分分析代码

1.加解密工具

#加密
def generic_openid(openid):s = Serializer(secret_key=settings.SECRET_KEY, expires_in=3600)access_token = s.dumps({'openid': openid})# 将bytes类型的数据转换为 strreturn 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 Noneelse:return result.get('openid')

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

#根据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 responseelse:# 存在#如果绑定过,则直接登录

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

源码分析:

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

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

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

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

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

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

解密

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

重点是这个unsign函数

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

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

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

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

二、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:

pip install itsdangerous==1.1.0

解决方法二:使用 URLSafeTimedSerializer 替代

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


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)


http://www.mrgr.cn/news/94736.html

相关文章:

  • Linux实时内核稳定性案例
  • Java:引用其他类的方法
  • Spring bean的作用域详解
  • Spring面试:Spring,SpringMVC,SpringBoot
  • Excel(函数篇):IF函数、FREQUNCY函数、截取函数、文本处理函数、日期函数、常用函数详解
  • 24.策略模式实现日志
  • 蓝桥杯专项复习——结构体、输入输出
  • 【入门初级篇】布局类组件的使用(1)
  • 市面上常用的23种设计模式,分析实现方式以及实际使用场景案例
  • Centos离线安装openssl-devel
  • 自探索大语言模型微调(一)
  • VSTO(C#)Excel开发8:打包发布安装卸载
  • 守护中国软件供应链安全,未名湖畔的筑梦人
  • Redis--Zset类型
  • 本地部署Spark集群
  • 【AIGC】OpenAI 集成 Langchain 操作实战使用详解
  • Ubuntu从源码安装Webots
  • MySQL 8.4.X 企业版TDE加密功能 测试和验证
  • 手写一些常见算法
  • 使用Python在Word中生成多种不同类型的图表