跳到主要内容

jwt

jwt 库提供 JWT(JSON Web Token)的生成、解析与攻击辅助能力,用于接口鉴权测试,尤其是常见的 JWT 误用漏洞(如算法混淆、空算法、弱密钥)验证。

典型使用场景:

  • 生成:jwt.JWTGenerate / jwt.JWTGenerateEx(自定义 header)按算法与密钥签发 Token,jwt.JWSGenerate / jwt.JWSGenerateEx 生成 JWS。
  • 解析与攻击:jwt.Parse 解析 Token 取出 claims,jwt.RemoveAlg 构造 alg=none 攻击 Token,jwt.AllAlgs 列出支持的算法。

与相邻库的关系:jwtcodec(底层签名/编码)、fuzz/poc(携带篡改后的 Token 发包)配合,用于鉴权绕过类测试。

共 7 个函数、14 个实例

实例

实例名类型说明
ALG_ES256string"ES256"
ALG_ES384string"ES384"
ALG_ES512string"ES512"
ALG_HS256string"HS256"
ALG_HS384string"HS384"
ALG_HS512string"HS512"
ALG_NONEstring"None"
ALG_PS256string"PS256"
ALG_PS384string"PS384"
ALG_PS512string"PS512"
ALG_RS256string"RS256"
ALG_RS384string"RS384"
ALG_RS512string"RS512"
CommonWeakJWTKeys[]string[]string{"secret", "...", "012345678901234567890123456789XY", "12345", "12345678901234567890123456789012", "61306132616264382D363136322D343163332D383364362D316366353539623436616663", "61306132616264382d363136322d343163332d383364362d316366353539623436616663", "872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4", "8zUpiGcaPkNhNGi8oyrq", "A43CC200A1BD292682598DA42DAA9FD14589F3D8BF832FFA206BE775259EE1EA", "C2A4EB068AF8ABEF18D80B1689C7D785", "GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk", "Hello, World!", "J5hZTw1vtee0PGaoAuaW", "[107 105 97 108 105]", "kiali", "My super secret key!", "Original secret string", "R9MyWaEoyiMYViVWo8Fk4TUGWiSoaW6U1nOqXri8_XU", "RfxRP43BIKoSQ7P1GfeO", "Secret key. You can use mix guardian.gen.secretto get one", "SecretKey", "Setec Astronomy", "SignerTest", "Super Secret Key", "THE_SAME_HMAC_KEY", "ThisIsMySuperSecret", "XYZ", "YOUR_HMAC_KEY", "YoUR sUpEr S3krEt 1337 HMAC kEy HeRE", "]V@IaC1%fU,DrVI", "mix guardian.gen.secret", "a43cc200a1bd292682598da42daa9fd14589f3d8bf832ffa206be775259ee1ea", "banana", "bar", "c2a4eb068af8abef18d80b1689c7d785", "client_secret_basic", "custom", "default-key", "example-hmac-key", "example_key", "fe1a1915a379f3be5394b64d14794932", "gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr9C", "guest", "hard!to-guess_secret", "has a van", "her key", "his key", "key", "key1", "key2", "key3", "kkey", "mix guardian.gen.secret", "my key", "my super secret password", "my$ecretK3y", "my_very_long_and_safe_secret_key", "mypass", "mysecretkey", "mysupersecretkey", "newSecret", "password", "secret-key", "secret123", "secret_key", "secret_key_here", "secretkey", "shared-secret", "shared_secret", "shhhhh", "shhhhhhared-secret", "some-secret-string", "super-secret-password", "super_fancy_secret", "supersecret", "symmetric key", "test-key", "testing1", "token", "too many secrets", "top secret", "verysecret", "wrong-secret", "xxx", "your-256-bit-secret", "your-384-bit-secret", "your-512-bit-secret", "your-own-jwt-secret", "your-top-secret-key", "jwt", "jwt-secret", "hmac-secret", "hs256-secret", "AC8d83&21Almnis710sds", "123456"}

函数索引

函数参数返回值说明
jwt.AllAlgs-[]stringAvailableJWTTokensAlgs 返回当前支持的所有 JWT 签名算法名称列表
jwt.JWSGeneratealg string, claims any, key []bytestring, error使用指定签名算法和密钥,把 claims 生成为一个 JWS(typ=JWS) 字符串
jwt.JWSGenerateExalg string, extraHeader any, claims any, key []bytestring, errorJWSGenerateExport 在 JWSGenerate 的基础上额外允许自定义头部(extraHeader)
jwt.JWTGeneratealg string, i any, key []bytestring, error使用指定签名算法和密钥,把 claims 生成为一个 JWT(typ=JWT) 字符串
jwt.JWTGenerateExalg string, extraHeader any, claims any, key []bytestring, errorJWTGenerateExport 在 JWTGenerate 的基础上额外允许自定义 JWT 头部(extraHeader)
jwt.RemoveAlgtoken stringstring, errorJwtChangeAlgToNone 把给定 JWT 的签名算法改写为 none(去除签名),常用于 JWT 安全测试

可变参数函数索引

函数参数返回值说明
jwt.ParsetokenStr string, keys ...string*Token, []byte, error解析 JWT 字符串,提取头部与载荷;当提供候选密钥时会尝试逐个验证签名

函数详情

AllAlgs

AllAlgs() []string

AvailableJWTTokensAlgs 返回当前支持的所有 JWT 签名算法名称列表

在 yak 中通过 jwt.AllAlgs 调用

返回值

序号类型说明
r1[]string支持的签名算法名称字符串切片,如 ES256、HS256、RS256 等

示例

algs = jwt.AllAlgs()
println(len(algs)) // OUT: 13
assert len(algs) >= 12, "should expose all supported jwt algorithms"

JWSGenerate

JWSGenerate(alg string, claims any, key []byte) (string, error)

使用指定签名算法和密钥,把 claims 生成为一个 JWS(typ=JWS) 字符串

参数

参数名类型说明
algstring签名算法名称,如 jwt.ALG_HS256
claimsany载荷 claims,通常是一个 map
key[]byte签名密钥(字节数组)

返回值

序号类型说明
r1string生成的 JWS 字符串
r2error错误信息,成功时为 nil

示例

// 用 HS256 生成 JWS 并解析校验往返一致
token = jwt.JWSGenerate(jwt.ALG_HS256, {"user": "admin"}, []byte("secret123"))~
_, key, err = jwt.Parse(token, "secret123")
assert err == nil, "valid token should parse without error"
println(string(key)) // OUT: secret123
assert string(key) == "secret123", "parse should recover the signing key"

JWSGenerateEx

JWSGenerateEx(alg string, extraHeader any, claims any, key []byte) (string, error)

JWSGenerateExport 在 JWSGenerate 的基础上额外允许自定义头部(extraHeader)

参数

参数名类型说明
algstring签名算法名称,如 jwt.ALG_HS256
extraHeaderany附加的头部字段,通常是一个 map
claimsany载荷 claims,通常是一个 map
key[]byte签名密钥(字节数组)

返回值

序号类型说明
r1string生成的 JWS 字符串
r2error错误信息,成功时为 nil

示例

// 生成带自定义头部的 JWS 并解析校验往返一致
token = jwt.JWSGenerateEx(jwt.ALG_HS256, {"kid": "k1"}, {"user": "admin"}, []byte("secret123"))~
_, key, err = jwt.Parse(token, "secret123")
assert err == nil, "valid token should parse without error"
println(string(key)) // OUT: secret123
assert string(key) == "secret123", "parse should recover the signing key"

JWTGenerate

JWTGenerate(alg string, i any, key []byte) (string, error)

使用指定签名算法和密钥,把 claims 生成为一个 JWT(typ=JWT) 字符串

参数

参数名类型说明
algstring签名算法名称,如 jwt.ALG_HS256、jwt.ALG_NONE 等
iany载荷 claims,通常是一个 map
key[]byte签名密钥(字节数组),HMAC 系列算法直接使用该密钥

返回值

序号类型说明
r1string生成的 JWT 字符串
r2error错误信息,成功时为 nil

示例

// 用 HS256 算法和密钥生成 JWT,再用同一密钥解析校验,验证往返一致
token = jwt.JWTGenerate(jwt.ALG_HS256, {"user": "admin"}, []byte("secret123"))~
_, key, err = jwt.Parse(token, "secret123")
assert err == nil, "valid token should parse without error"
println(string(key)) // OUT: secret123
assert string(key) == "secret123", "parse should recover the signing key"

JWTGenerateEx

JWTGenerateEx(alg string, extraHeader any, claims any, key []byte) (string, error)

JWTGenerateExport 在 JWTGenerate 的基础上额外允许自定义 JWT 头部(extraHeader)

参数

参数名类型说明
algstring签名算法名称,如 jwt.ALG_HS256
extraHeaderany附加的头部字段,通常是一个 map
claimsany载荷 claims,通常是一个 map
key[]byte签名密钥(字节数组)

返回值

序号类型说明
r1string生成的 JWT 字符串
r2error错误信息,成功时为 nil

示例

// 生成带自定义头部 kid 的 JWT,并用同一密钥解析校验往返一致
token = jwt.JWTGenerateEx(jwt.ALG_HS256, {"kid": "k1"}, {"user": "admin"}, []byte("secret123"))~
_, key, err = jwt.Parse(token, "secret123")
assert err == nil, "valid token should parse without error"
println(string(key)) // OUT: secret123
assert string(key) == "secret123", "parse should recover the signing key"

RemoveAlg

RemoveAlg(token string) (string, error)

JwtChangeAlgToNone 把给定 JWT 的签名算法改写为 none(去除签名),常用于 JWT 安全测试

在 yak 中通过 jwt.RemoveAlg 调用,保留原始头部与载荷,仅去掉签名部分

参数

参数名类型说明
tokenstring原始 JWT 字符串

返回值

序号类型说明
r1string算法被改写为 none 的新 JWT 字符串
r2error错误信息,成功时为 nil

示例

// 把已有 token 改写为 alg:none 形式,验证生成结果可被再次解析出原始 claims
token = jwt.JWTGenerate(jwt.ALG_HS256, {"user": "admin"}, []byte("secret123"))~
noneToken = jwt.RemoveAlg(token)~
tokenObj, _, _ = jwt.Parse(noneToken)
assert tokenObj != nil, "alg:none token should still be parseable"

可变参数函数详情

Parse

Parse(tokenStr string, keys ...string) (*Token, []byte, error)

解析 JWT 字符串,提取头部与载荷;当提供候选密钥时会尝试逐个验证签名

在 yak 中通过 jwt.Parse 调用。不传密钥时仅做解析展示;传入正确密钥时返回该密钥

必填参数

参数名类型说明
tokenStrstring待解析的 JWT 字符串

可选参数

参数名类型说明
keys...string可选的候选签名密钥列表,用于尝试验证 token 签名

返回值

序号类型说明
r1*Token解析得到的 Token 对象,包含头部与载荷
r2[]byte验证成功时命中的密钥(字节数组),未命中时为 nil
r3error错误信息,解析或验证失败时非 nil

示例

// 先用密钥签发 token,再用同一密钥解析校验,验证往返一致
token = jwt.JWTGenerate(jwt.ALG_HS256, {"user": "admin"}, []byte("secret123"))~
tokenObj, key, err = jwt.Parse(token, "secret123")
assert err == nil, "valid token should parse without error"
println(string(key)) // OUT: secret123
assert string(key) == "secret123", "parse should recover the signing key"