如何使用 OpenSSL shell 命令创建 Json Web 令牌 (JWT)?
How to create a Json Web Token (JWT) using OpenSSL shell commands?
我正在尝试在 MacOS 上使用命令行实用程序创建一个 JSON Web 令牌 (JWT),但在签名部分遇到了障碍。
这个要点给我很大的启发:https://gist.github.com/indrayam/dd47bf6eef849a57c07016c0036f5207
对于我的 JWT 我有
Header:
{"alg":"HS256","typ":"JWT"}
有效负载:
{"email":"jordan@example.com"}
我的 hmac 密码是:
bigsecretisveryhardtoguessbysneakypeopleright
或者在 base64 中:
Ymlnc2VjcmV0aXN2ZXJ5aGFyZHRvZ3Vlc3NieXNuZWFreXBlb3BsZXJpZ2h0Cg==
我使用以下网站进行验证:
https://jwt.io/
我发现如果我使用我的秘密的 base64 版本将所有这些输入网站,它会生成以下 JWT,成功验证我正在测试的网站:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9.C3MVjfmnul8dLNIgiv6Dt3jSefD07Y0QtDrOZ5oYSXo
在 bash 中,我尝试使用:
jwt_header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
payload=$(echo -n '{"email":"jordan@example.com"}' | base64 | sed s/\+/-/g |sed 's/\//_/g' | sed -E s/=+$//)
hmac_signature=$(echo -n "${jwt_header}.${payload}" | openssl dgst -sha256 -hmac "${key}" -binary | openssl base64 -e -A | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
jwt="${jwt_header}.${payload}.${hmac_signature}"
产生了以下结果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpyZWVkQGV4dG9sZS5jb20ifQ.o426f0XDnsUwActVt14Cr3X3IUqPwfv6yaN5nRaZhew
我发帖的网站不认为这是有效的。所以我不确定我在没有获得有效 HS256 签名的 openssl 命令中做错了什么。
我能够从 https://jwt.io/
重新创建 JWT
在您的示例中,用户密码 上有一个隐藏的换行符。所以在下面,我还添加了换行符,纯粹是为了重新创建所需的输出。
此外,您的有效负载中的电子邮件地址不一致,因此在下面我使用了 jordan@example.com
.
我对 hmac 步骤采取了稍微不同的方法。我将用户密码转换为十六进制字节并将其用作密钥(使用 HMAC 的 hexkey
选项)。
# Construct the header
jwt_header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
# ans: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# Construct the payload
payload=$(echo -n '{"email":"jordan@example.com"}' | base64 | sed s/\+/-/g |sed 's/\//_/g' | sed -E s/=+$//)
# ans: eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9
# Store the raw user secret (with example of newline at end)
secret=$'bigsecretisveryhardtoguessbysneakypeopleright\n'
# Note, because the secret may have newline, need to reference using form $""
echo -n "$secret"
# Convert secret to hex (not base64)
hexsecret=$(echo -n "$secret" | xxd -p | paste -sd "")
# ans: 62696773656372657469737665727968617264746f67756573736279736e65616b7970656f706c6572696768740a
# For debug, also display secret in base64 (for input into https://jwt.io/)
echo -n "$secret" | base64
# ans: Ymlnc2VjcmV0aXN2ZXJ5aGFyZHRvZ3Vlc3NieXNuZWFreXBlb3BsZXJpZ2h0Cg==
# Calculate hmac signature -- note option to pass in the key as hex bytes
hmac_signature=$(echo -n "${jwt_header}.${payload}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:$hexsecret -binary | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
# Create the full token
jwt="${jwt_header}.${payload}.${hmac_signature}"
# ans: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9.C3MVjfmnul8dLNIgiv6Dt3jSefD07Y0QtDrOZ5oYSXo
我正在尝试在 MacOS 上使用命令行实用程序创建一个 JSON Web 令牌 (JWT),但在签名部分遇到了障碍。
这个要点给我很大的启发:https://gist.github.com/indrayam/dd47bf6eef849a57c07016c0036f5207
对于我的 JWT 我有 Header:
{"alg":"HS256","typ":"JWT"}
有效负载:
{"email":"jordan@example.com"}
我的 hmac 密码是:
bigsecretisveryhardtoguessbysneakypeopleright
或者在 base64 中:
Ymlnc2VjcmV0aXN2ZXJ5aGFyZHRvZ3Vlc3NieXNuZWFreXBlb3BsZXJpZ2h0Cg==
我使用以下网站进行验证: https://jwt.io/
我发现如果我使用我的秘密的 base64 版本将所有这些输入网站,它会生成以下 JWT,成功验证我正在测试的网站:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9.C3MVjfmnul8dLNIgiv6Dt3jSefD07Y0QtDrOZ5oYSXo
在 bash 中,我尝试使用:
jwt_header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
payload=$(echo -n '{"email":"jordan@example.com"}' | base64 | sed s/\+/-/g |sed 's/\//_/g' | sed -E s/=+$//)
hmac_signature=$(echo -n "${jwt_header}.${payload}" | openssl dgst -sha256 -hmac "${key}" -binary | openssl base64 -e -A | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
jwt="${jwt_header}.${payload}.${hmac_signature}"
产生了以下结果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpyZWVkQGV4dG9sZS5jb20ifQ.o426f0XDnsUwActVt14Cr3X3IUqPwfv6yaN5nRaZhew
我发帖的网站不认为这是有效的。所以我不确定我在没有获得有效 HS256 签名的 openssl 命令中做错了什么。
我能够从 https://jwt.io/
重新创建 JWT在您的示例中,用户密码 上有一个隐藏的换行符。所以在下面,我还添加了换行符,纯粹是为了重新创建所需的输出。
此外,您的有效负载中的电子邮件地址不一致,因此在下面我使用了 jordan@example.com
.
我对 hmac 步骤采取了稍微不同的方法。我将用户密码转换为十六进制字节并将其用作密钥(使用 HMAC 的 hexkey
选项)。
# Construct the header
jwt_header=$(echo -n '{"alg":"HS256","typ":"JWT"}' | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
# ans: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
# Construct the payload
payload=$(echo -n '{"email":"jordan@example.com"}' | base64 | sed s/\+/-/g |sed 's/\//_/g' | sed -E s/=+$//)
# ans: eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9
# Store the raw user secret (with example of newline at end)
secret=$'bigsecretisveryhardtoguessbysneakypeopleright\n'
# Note, because the secret may have newline, need to reference using form $""
echo -n "$secret"
# Convert secret to hex (not base64)
hexsecret=$(echo -n "$secret" | xxd -p | paste -sd "")
# ans: 62696773656372657469737665727968617264746f67756573736279736e65616b7970656f706c6572696768740a
# For debug, also display secret in base64 (for input into https://jwt.io/)
echo -n "$secret" | base64
# ans: Ymlnc2VjcmV0aXN2ZXJ5aGFyZHRvZ3Vlc3NieXNuZWFreXBlb3BsZXJpZ2h0Cg==
# Calculate hmac signature -- note option to pass in the key as hex bytes
hmac_signature=$(echo -n "${jwt_header}.${payload}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:$hexsecret -binary | base64 | sed s/\+/-/g | sed 's/\//_/g' | sed -E s/=+$//)
# Create the full token
jwt="${jwt_header}.${payload}.${hmac_signature}"
# ans: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpvcmRhbkBleGFtcGxlLmNvbSJ9.C3MVjfmnul8dLNIgiv6Dt3jSefD07Y0QtDrOZ5oYSXo