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(曲线名称)、xy坐标等,能够正确处理ECDSA P-256、P-384、P-521等曲线。

回到顶部