如何通过 bash 脚本正确获取 HMACSHA256 哈希

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

我正在尝试使用终端/bash 脚本创建 JWT 令牌。我目前有

data=$encoded_header.$encoded_payload
signature=$(echo -n "$data" | openssl dgst -sha256 -hmac dummy_secret -binary | openssl base64 -e -A | tr -d '=')

其中数据将打印有效的标头和有效负载,通过

.
连接(这些值仅存储在脚本前面的变量中。标头和有效负载很好)

当我粘贴完整 jwt 令牌的输出时(这只是

$data.$signature
示例输出:

eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJIUzI1NiJ9Cg.eyJleHAiOiAxNzI0MDczMzI1LCAiaXNzIjogImR1bW15X2tleSJ9Cg./LI0Qs6U1p8x1zRFCwUe2kHW224L9js3fVW3UjpxO 70

进入 https://jwt.io/ 我收到以下错误:


警告:您的 JWT 签名似乎未使用 base64url 正确编码 (
https://tools.ietf.org/html/rcfc4648#section-5

)。请注意,填充(“=”必须被省略,按照https://tools.ietf.org/html/rcfc4648#section-2

我查看了一些 openssl 文档,并认为我做得正确,但是这个错误让我有不同的想法。有谁知道正确的 bash 脚本命令以便为此 JWT 标头和有效负载创建有效签名?

bash shell jwt base64 hmac
2个回答
0
投票

警告:您的 JWT 签名似乎未使用 base64url 正确编码 (
https://tools.ietf.org/html/rcfc4648#section-5

)。请注意,填充(“=”必须被省略,按照https://tools.ietf.org/html/rcfc4648#section-2

这意味着您的令牌编码不正确。 JWT 需要进行 Base64Url 编码,但您刚刚创建了一个 Base64 编码的令牌并删除了填充。 您还需要将
Invalid Signature

替换为

+
,将
-
替换为
/
_

第二个非常常见的问题是许多人忘记提供在 jwt.io 上验证签名所需的秘密或密钥。如果不知道秘密,就无法验证签名。


0
投票

下面是使用对称密钥生成 JWT 的完整示例。您还可以测试签名验证。 :) 我也包括了 iat 时间。

signature=$(echo -n "$data" | openssl dgst -sha256 -hmac dummy_secret -binary | openssl base64 -e -A | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)

# Test the script by changing the secret and running the script
# secret='your-secret'
© www.soinside.com 2019 - 2024. All rights reserved.