与示例JWT相比,获得了不正确的HMAC SHA256签名

问题描述 投票:0回答:1

我正在尝试遵循RFC for JSON Web Signatures(A.1.1),但是在遵循示例时遇到了一些问题。

我将所有内容整理到最后,在这里我无法生成相同的签名。这是示例Python 3.8代码:

import hmac
import hashlib
import base64
signing_input = b"eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ"
key = b"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"
signature = hmac.digest(key, signing_input, digest=hashlib.sha256)

print(base64.urlsafe_b64encode(signature))
# Output: b'ZekyXWlxvuCN9H8cuDrZfaRa3pMJhHpv6QKFdUqXbLc='
# Expected: b'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk'

另外,我已经尝试了一些处理HMAC-SHA256的在线工具,但得到的输出与Python脚本提供的输出相同。关于我要去哪里的任何想法?

python jwt hmac
1个回答
0
投票

您使用了错误的密钥。 RFC使用JSON Web Key JSON Web Algorithm"oct"格式显示密钥。这意味着密钥是base64url编码的字节序列。如果要使结果匹配,则需要在使用前对其进行解码。

请注意,python的urlsafe_b64decodeurlsafe_b64encode并未完全实现base64url编码。应删除JWT使用的base64url编码所指定的python函数期望/产品填充字符。

将所有内容放在一起:

import hmac
import hashlib
import base64

signing_input = b"eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ"
key = b"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"

# Decode the key.  Pad it with '=' characters to a length divisible by 3 
# as expected by urlsafe_b64decode
key = base64.urlsafe_b64decode(key + b'=' * (len(key) % 3))

signature = hmac.digest(key, signing_input, digest=hashlib.sha256)
signature = base64.urlsafe_b64encode(signature)

# Strip off any '=' characters urlsafe_b64encode added to pad the key to
# a length divisible by 3
signature = signature.rstrip(b'=')
print(signature)
# Prints: b'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk'
© www.soinside.com 2019 - 2024. All rights reserved.