PLP*_*ers 1 python cryptography jwt docker kubernetes
我正在使用python-jose的 JWT 实现来生成用于身份验证的 JWT 令牌。
我们在 Kubernetes 上的 Docker 容器中运行我们的后端,有时,当我们有多个 pod 时,我们会为相同的声明、秘密和算法获得不同的令牌。我也有当这种情况发生在一个容器中对我的发展环境touch荷兰国际集团我的index.wsgi脚本。
吊舱 1:
>>> jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ2YWx1ZSJ9.FG-8UppwHaFp1LgRYQQeS6EDQF7_6-bMFegNucHjmWg'
Run Code Online (Sandbox Code Playgroud)
吊舱 2:
>>> jwt.encode({'key': 'value'}, 'secret', algorithm='HS256')
'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXkiOiJ2YWx1ZSJ9.JPIDicqvQ6GAh14yE2yZ3wnZQ0LiLNTTRDtJgLZcn98'
Run Code Online (Sandbox Code Playgroud)
我深入研究了代码,看看是什么导致了这种情况,但没有发现任何有罪的东西。简而言之,代码的作用如下:
json.dumps算法头 ( {'typ': 'JWT', 'alg': 'HS256'}) 并将其编码为 Base64,删除 any=的json.dumps有效载荷 ( {'key': 'value'}) 并将其编码为 Base64,删除 any=的encoded_header.encoded_payload使用HMAC256与secret键和编码它为Base64,再删除任何=的encoded_header.encoded_payload.encoded_signature在这一点上,我不知道是什么导致了这种情况。我怀疑 Python 的 HMAC 或 SHA256 实现中存在某种错误,但这似乎不太可能......有任何线索吗?
注意:我们已经成功地用 重现了错误pyjwt,这是python-jose.
这是因为 Python 字典是无序的。如果您对两个 JWT 进行解码,您将看到每个令牌的标头部分的顺序不同。
{
"typ": "JWT",
"alg": "HS256"
}
Run Code Online (Sandbox Code Playgroud)
和
{
"alg": "HS256",
"typ": "JWT"
}
Run Code Online (Sandbox Code Playgroud)
这会导致 base64 编码的标头不同,进而导致签名不同。
也就是说,这两个都是完全相同的声明集的有效令牌,并且都应该成功验证。JWT 规范中没有任何内容规定等效的声明集应产生等效的 JWT 输出。
注意:我是python-jose库的作者。
| 归档时间: |
|
| 查看次数: |
1024 次 |
| 最近记录: |