首页 > 解决方案 > 在 rfc7515 的第 3.3 节中无法获得相同的签名

问题描述

rfc7515中,有一个 jws 示例:

BASE64URL(UTF8(JWS 保护标头)) = eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

BASE64URL(JWS 有效负载) = eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

它的密钥是一个 jwk:

{“kty”:“oct”,“k”:“ AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow ”}

然后我们需要使用 HMAC SHA-256 算法使用指定的密钥和 base64url- 计算 JWS 签名输入 ASCII(BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload)) 的 HMAC编码结果。

在 jws 示例中,它给出“ dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk ”作为签名,而我得到“ ZekyXWlxvuCN9H8cuDrZfaRa3pMJhHpv6QKFdUqXbLc= ”。有什么问题吗?

这是我的python3代码。

import hashlib
import hmac
import base64

message = bytes('eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ','ascii')

secret = bytes('AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow','utf-8')

signature = base64.urlsafe_b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())

print(signature)

标签: jwthmac

解决方案


我发现直接用密钥字节签名是错误的。我应该使用 base64url_decode(key)。然后我得到正确的签名'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk='。

import hashlib
import hmac
import base64

message = bytes('eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ','ascii')

secret = base64.urlsafe_b64decode('AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow==')

signature = base64.urlsafe_b64encode(hmac.new(secret, message, digestmod=hashlib.sha256).digest())

print(signature)

推荐阅读