Jwt 无法获得rfc7515第3.3节中的相同签名

Jwt 无法获得rfc7515第3.3节中的相同签名,jwt,hmac,Jwt,Hmac,在中,有一个jws示例: BASE64URL(UTF8(JWS保护头))=eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 BASE64URL(JWS有效载荷)=EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODASDQOGIMH0Dha6ly9LegftCGXLLMNVBS9PC19YB290IJP0CNVLFQ 其密钥是jwk: {“kty”:“oct”, “k”:“AyM1SysPpbyDfgZld3umj1qzKObwVMk

在中,有一个jws示例:

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

BASE64URL(JWS有效载荷)=EYJPC3MIOIJQB2UILA0KIJLEHAIOJEZMDA4MTKZODASDQOGIMH0Dha6ly9LegftCGXLLMNVBS9PC19YB290IJP0CNVLFQ

其密钥是jwk:

{“kty”:“oct”, “k”:“AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr\u T-1QS0GZH75AKTMN3YJ0IPS4HCGUTWJAZR1Z9CAOW” }

然后我们需要使用HMAC SHA-256算法,使用指定的键和BASE64URL编码结果,计算JWS签名输入ASCII(BASE64URL(UTF8(JWS保护头))| |'.| | BASE64URL(JWS有效负载))的HMAC

在jws示例中,它给出了“dBjftJeZ4CVP-mB92K27uhbUJU1p1r\u 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)


我发现直接用密钥字节签名是错误的。我应该使用base64url\u解码(键)。然后我得到了正确的签名“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)