首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang包jwt-go with rsa key。如何放置公钥,如何从令牌中获取公钥?

Golang包jwt-go with rsa key。如何放置公钥,如何从令牌中获取公钥?
EN

Stack Overflow用户
提问于 2015-03-20 10:57:42
回答 1查看 9.7K关注 0票数 2

我正在尝试使用golang中的jwt-go包生成一个带有rsa密钥的令牌。

Here有一个博客解释了如何做到这一点,但该代码将始终验证所有令牌,因为它使用的是存储在服务器中的公钥,而不是从令牌中获取的公钥。如何将完整的公钥放入令牌中?我试着这样做:

代码语言:javascript
复制
var secretKey, _ = rsa.GenerateKey(rand.Reader, 1024)
token := jwt.New(jwt.SigningMethodRS256)
token.Claims["username"] = "victorsamuelmd"
token.Claims["N"] = secretKey.PublicKey.N
token.Claims["E"] = secretKey.PublicKey.E

tokenString, err := token.SignedString(secretKey)

nt, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) {
    // here I need to recover the public key from the token
    // but N is a big.Int and the token stores N as int64
})

对不起,我的英语不好。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-07-27 22:59:17

我认为将公钥存储在声明中不是一个好主意,因为我们可以使用该密钥从技术上验证JWT,但这意味着它不再是签名的JWT。如果任何人都可以使用自己的私钥生成JWT并将公钥存储在JWT中,我们就不能确定谁是签名者。

无论如何,您可以将公钥转换为PEM格式,这只是一个字符串,并将其存储在权利要求中。在客户端,您也可以简单地将其再次解析为公钥格式。示例代码如下:

代码语言:javascript
复制
privateKey, _ := rsa.GenerateKey(rand.Reader, 1024)
bytes, _ := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
pem := pem.EncodeToMemory(&pem.Block{
    Type:  "RSA PUBLIC KEY",
    Bytes: bytes,
})
claim["publickey"] = string(pem)

代码语言:javascript
复制
pem := []byte(claims["publickey"].(string))
return jwt.ParseRSAPublicKeyFromPEM(pem)

jwtdgrijalva's jwt-go

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29158646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档