eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoieWFuZHVuIiwicGhvbmUiOiIxMjM0NTYiLCJpc3MiOiJhYWEiLCJzdWIiOiJ4eCJ9.XhXWcwuMlcN_6DYlAjSmJfISwl4Te-lDCsMwFIGrQLA
Header 部分是一个 JSON 对象,用来描述生成的 JWT 的元数据,例如算法类型(通常为 HMAC SHA256 或 RSA)和 token 类型。该部分经过 Base64 编码,但没有加密处理。
echo eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | base64 -d
{"alg":"HS256","typ":"JWT"}
Payload 部分包含了 JWT 的主体信息,也就是存放实际的数据。这些数据被称为声明(claims),包括一些预定义的声明(如过期时间、发布者、受众等)和一些自定义的声明。 与头部一样,该部分也是一个 JSON 对象,经过 Base64 编码,但没有加密处理。 示例:
echo eyJuYW1lIjoieWFuZHVuIiwicGhvbmUiOiIxMjM0NTYiLCJpc3MiOiJhYWEiLCJzdWIiOiJ4eCJ9 | base64 -d
{"name":"yandun","phone":"123456","iss":"aaa","sub":"xx"}
echo -n '{"name":"yandun","phone":"123456","iss":"aaa","sub":"xx"}' | base64
eyJuYW1lIjoieWFuZHVuIiwicGhvbmUiOiIxMjM0NTYiLCJpc3MiOiJhYWEiLCJzdWIiOiJ4eCJ9
echo eyJuYW1lIjoieWFuZHVuIiwicGhvbmUiOiIxMjM0NTYiLCJpc3MiOiJhYWEiLCJzdWIiOiJ4eCJ9 | base64 -d
{"name":"yandun","phone":"123456","iss":"aaa","sub":"xx"}
Signature 部分是使用 Header 头部和 Payload 负载进行签名的结果。签名部分用于验证 Token 的完整性和真实性,以防止数据被篡改。签名通常使用密钥和指定的算法进行计算生成。该部分是将编码后的 Header 和 Payload 与密钥组合后,通过给定的算法进行哈希计算得出的结果。 示例:
计算base64编码后的 header.playload 的签名
echo -n "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoieWFuZHVuIiwicGhvbmUiOiIxMjM0NTYiLCJpc3MiOiJhYWEiLCJzdWIiOiJ4eCJ9" | openssl dgst -sha256 -hmac "JWTKey" -binary | base64 | sed 's#/#_#g' | sed 's/+/-/g' | sed 's/=//g'
echo -n 选项用于在输出后不换行
openssl dgst -sha256 -hmac “JWTKey” -binary
dgst 是 openssl 命令的子命令,用于创建消息摘要(哈希值)。
-sha256 选项指定使用 SHA256 哈希算法。
-hmac “JWTKey” 选项指定使用 HMAC-SHA256 算法,并使用 “JWTKey” 作为密钥。
-binary 选项表示以二进制(原始)数据输出。
base64 命令用于将数据进行 Base64 编码。
sed ‘s#/##g’ | sed ‘s/+/-/g’ | sed ‘s/=//g’
这三个 sed 命令用于替换输出中的字符。
sed 's#/##g’ 将输出中的 / 替换为 _。
sed ‘s/+/-/g’ 将输出中的 + 替换为 -。
sed ‘s/=//g’ 删除输出中的 =。
总结起来,这条命令将输入的 JWT 字符串,使用 “JWTKey” 作为密钥计算 HMAC-SHA256 哈希值,然后对哈希值进行 Base64 编码,并对输出的结果进行一系列字符替换。
XhXWcwuMlcN_6DYlAjSmJfISwl4Te-lDCsMwFIGrQLA
touch a.txt
openssl genrsa -out genrsa.pri
openssl dgst -sha256 -out sha256_nohex.sign -sign genrsa.pri a.txt
openssl dgst -sha256 -prverify genrsa.pri -signature sha256_nohex.sign a.txt
Verified OK