首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同的服务器使用相同的参数生成不同的JWT令牌。

不同的服务器使用相同的参数生成不同的JWT令牌。
EN

Stack Overflow用户
提问于 2017-04-11 16:25:27
回答 1查看 1.1K关注 0票数 1

我正在使用python-jose的JWT实现来生成用于身份验证的JWT令牌。

我们在Kubernetes和上的Docker容器中运行后端,有时,当我们有多个吊舱时,对于相同的声明、秘密和算法,我们会得到不同的令牌。我在开发环境中的单个容器上也出现了这种情况,当时touch正在编写index.wsgi脚本。

第一批:

代码语言:javascript
复制
>>> jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSJ9.FG-8UppwHaFp1LgRYQQeS6EDQF7_6-bMFegNucHjmWg'

第二批:

代码语言:javascript
复制
>>> jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ2YWx1ZSJ9.JPIDicqvQ6GAh14yE2yZ3wnZQ0LiLNTTRDtJgLZcn98'

我深入研究了代码,看看是什么导致了这一点,但没有发现任何证据。简而言之,下面是代码所做的工作:

  1. 执行算法头的json.dumps ({'typ': 'JWT', 'alg': 'HS256'})并将其编码为Base64,删除任何=
  2. 执行有效载荷的json.dumps ({'key': 'value'})并将其编码为Base64,删除任何=
  3. 使用encoded_header.encoded_payload键使用HMAC256对secret进行签名,并将其编码为Base64,再次删除任何=
  4. 将签名连接到前一个字符串,从而产生encoded_header.encoded_payload.encoded_signature

在这一点上,我不知道是什么导致了这一切。我怀疑Python的HMAC或SHA256实现中存在某种bug,但这似乎不太可能.有什么线索吗?

注意:我们已经成功地用pyjwt复制了这个bug,这是python-jose的基础。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-11 16:40:12

这是因为Python字典是无序的。如果您对这两个JWT进行解码,您将看到每个令牌的头部分排序不同。

代码语言:javascript
复制
{
    "typ": "JWT",
    "alg": "HS256"
}

代码语言:javascript
复制
{
    "alg": "HS256",
    "typ": "JWT"
}

这会导致base64编码的标头不同,这反过来又会导致签名不同。

也就是说,这两个都是完全相同的声明集的有效令牌,两者都应该成功地验证。JWT规范中没有任何东西规定等效的索赔集应该产生等效的JWT输出。

注意:我是python-jose库的作者。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43351439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档