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

Python 与示例JWT相比,获取不正确的HMAC SHA256签名,python,jwt,hmac,Python,Jwt,Hmac,我试图遵循(A.1.1),但在遵循示例时遇到了一些问题 我把一切都准备好了,直到最后,我无法生成相同的签名。以下是Python 3.8代码示例: import hmac import hashlib import base64 signing_input = b"eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc

我试图遵循(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脚本提供的相同。你知道我哪里出错了吗?

你用错键了。RFC使用
的“oct”
格式显示密钥。这意味着密钥是base64url编码的字节序列。如果希望结果匹配,则需要在使用前对其进行解码

请注意,python的
urlsafe\u b64decode
urlsafe\u b64encode
并不完全实现JWT和friends使用的base64url编码。python函数期望/产生填充字符,JWT指定的base64url编码应该删除这些填充字符

综上所述:

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 4 
# as expected by urlsafe_b64decode
if len(key) % 4 == 2:
    key += b'=='
elif len(key) % 4 == 3:
    key += b'='

key = base64.urlsafe_b64decode(key)

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 4
signature = signature.rstrip(b'=')
print(signature)
# Prints: b'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk'

非常感谢。我在这里被困了很长一段时间。我已接受您的答案作为解决方案,但由于帐户限制,无法投票。