jwt - 在 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)
解决方案
我发现直接用密钥字节签名是错误的。我应该使用 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)
推荐阅读
- typescript - 使用 cypress 命令验证下载文件(PDF/Word/Excel)的数据
- angular - 使用 ViewChild 的 Angular 6
- python - 如何切换到 iFrame,在 Selenium 中不起作用
- java - 在在线申请中使用 Java 执行器服务
- android - Android Studio Kotlin 多次传递意图和全局数组?
- c# - 为什么该方法在没有调用脚本标签的情况下运行?
- javascript - 从 ReactJS 中的状态对象中删除以前的事件
- node.js - 在 MERN 应用程序中,如果您的服务器上有 app.get('/') 和
在您的客户端上,哪个将首先触发或优先? - c - 通过 Shaker 排序对数组的主对角线进行排序
- ios - Delphi/ios:如何在我的 iOS 应用程序中包含动态库?