Golang中使用JSON Web Key (JWK)实现PublicKey解析
Golang中使用JSON Web Key (JWK)实现PublicKey解析 有没有人在Golang中实现过JSON Web密钥公钥编码?
使用ECDSA算法解码JWK最合适的Go语言库是什么?
3 回复
我之前使用过 jwt-go 一段时间。使用公钥/私钥对时,代码类似下面的代码片段所示。
请注意,我将 jwt.StandardClaims 嵌入到了我自己的结构体 sbcsClaims 中。这当然是可选的。
package main
import (
"errors"
"fmt"
"io/ioutil"
jwt "github.com/dgrijalva/jwt-go"
"github.com/satori/go.uuid"
)
更多关于Golang中使用JSON Web Key (JWK)实现PublicKey解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我已经找到并使用“http://github.com/lestrrat-go/jwx/jwk”
func getPublicKeyJwk(jsonBuf []byte) (interface{}, error) {
pubKeyJwk, err := jwk.Parse(jsonBuf)
if err != nil {
return nil, err
}
key := pubKeyJwk.Keys[0]
pubKey, err := key.Materialize()
if err != nil {
return nil, err
}
return pubKey, nil
}
在Golang中处理JSON Web Key (JWK) 的公钥解析,推荐使用 github.com/lestrrat-go/jwx/v2/jwk 库,它提供了完整的JWK支持,包括ECDSA密钥的编解码。
以下是使用示例:
package main
import (
"crypto/ecdsa"
"fmt"
"log"
"github.com/lestrrat-go/jwx/v2/jwk"
)
func main() {
// JWK JSON 数据(示例使用P-256曲线)
jwkJSON := `{
"kty": "EC",
"crv": "P-256",
"x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
"y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
"use": "sig",
"kid": "example-ec-key"
}`
// 解析JWK
key, err := jwk.ParseKey([]byte(jwkJSON))
if err != nil {
log.Fatalf("解析JWK失败: %s", err)
}
// 转换为ecdsa.PublicKey
var pubKey ecdsa.PublicKey
if err := key.Raw(&pubKey); err != nil {
log.Fatalf("提取公钥失败: %s", err)
}
// 验证密钥类型
if key.KeyType() != jwk.KeyTypeEC {
log.Fatal("非EC密钥")
}
fmt.Printf("公钥解析成功:\n")
fmt.Printf("曲线: %s\n", pubKey.Curve.Params().Name)
fmt.Printf("X坐标: %x\n", pubKey.X)
fmt.Printf("Y坐标: %x\n", pubKey.Y)
}
对于更复杂的JWK Set处理:
// 解析JWK Set
jwkSetJSON := `{
"keys": [
{
"kty": "EC",
"crv": "P-256",
"x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4",
"y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM",
"use": "sig",
"kid": "ec-key-1"
}
]
}`
set, err := jwk.Parse([]byte(jwkSetJSON))
if err != nil {
log.Fatalf("解析JWK Set失败: %s", err)
}
// 通过kid查找特定密钥
if key, exists := set.LookupKeyID("ec-key-1"); exists {
var pubKey ecdsa.PublicKey
if err := key.Raw(&pubKey); err != nil {
log.Fatalf("提取公钥失败: %s", err)
}
fmt.Printf("找到密钥: %s\n", key.KeyID())
}
安装依赖:
go get github.com/lestrrat-go/jwx/v2/jwk
这个库支持所有标准JWK参数,包括kty(密钥类型)、crv(曲线名称)、x和y坐标等,能够正确处理ECDSA P-256、P-384、P-521等曲线。

