【发布时间】: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