【问题标题】:JWT hs512 signature slightly different from jwt.io if calculated with python如果使用 python 计算,JWT hs512 签名与 jwt.io 略有不同
【发布时间】:2021-01-08 19:34:57
【问题描述】:

所以我会为同一个 JWT 获得不同的签名。

标题

{
  "alg": "HS512",
  "typ": "JWT"
}

有效载荷

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

我使用“abc”作为签名密钥

jwt.io 生成的 JWT 如下:eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.sNgS2IRq0LCvUaIzg9dCBVvmY_9KnrXDEmKTii6U4APbRMeUkU084wf3h5v4baP2WeZOyGunCTEa9wxh25IW6w

如果我像这样用 python 计算签名:

import hmac
import hashlib
import base64

s= b"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ"

res = base64.b64encode(hmac.new(b"abc", msg=s, digestmod=hashlib.sha512).digest())

print(res)

然后打印: b'sNgS2IRq0LCvUaIzg9dCBVvmY/9KnrXDEmKTii6U4APbRMeUkU084wf3h5v4baP2WeZOyGunCTEa9wxh25IW6w=='

现在除了最后两个字符“==”和这个“/”之外,它们是相同的。有人可以向我解释为什么会这样吗?它只是base64的填充,实际上两个等号是否存在并不重要?这就是 jwt.io 删除它们的原因吗?

编辑: 将 python 代码更改为 jps 的提示就可以了:

import hmac
import hashlib
import base64

s= b"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ"

res = base64.b64encode(hmac.new(b"abc", msg=s, digestmod=hashlib.sha512).digest())
x = res.decode("utf-8")
x = x.replace("+","-")
x = x.replace("/","_")
x = x.replace("=", "")
print(x)

【问题讨论】:

    标签: python-3.x jwt base64 signature hmac


    【解决方案1】:

    在您的 Python 代码中,您使用了 Base64 编码,但 JWT standard 需要 Base64URL 编码。不同之处在于Base64编码中的字符“+”和“/”被替换为“-”和“_”,并且省略了填充。

    根据接收方 Base64URL 解码器的实现,它可能有效,也可能无效。为了安全起见,我建议遵循标准。

    【讨论】:

    • 所以添加 x = res.decode("utf-8") x = x.replace("+","-") x = x.replace("/","_") x = x.replace("=", "") 应该总是解决问题吧?!
    • jwt 标准是否明确禁止填充?链接的 rfc7519 没有声明填充 == 是不允许的。
    • @TheMaster 填充在 RFC 中根本没有提到,但它提到“每个部分都包含一个 base64url 编码的值”,并且 base64url 不使用填充,因为一个“=”在url 有特殊含义。
    • @jps 再次检查,看来还是要执行。我不认为 jwt 会因为额外的填充而失败。
    • @TheMaster 我也不认为普通的 JWT 框架会在散列填充上出现问题,并且在大多数情况下,JWT 不是在 URL 中而是在 HTTP 标头中传输的。但是经常会出现由不同 Base64 编码标准的细微差别引起的问题,当有疑问时,我只能建议遵循标准以确保安全。
    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 2012-08-02
    • 2016-11-06
    • 2017-07-05
    • 1970-01-01
    • 2020-12-23
    相关资源
    最近更新 更多