与公钥和私钥以及JWT有关的困惑

时间:2015-06-20 09:32:47

标签: google-app-engine go jwt

我正在Go Web服务中尝试JWT(JSON Web令牌)。这是我到目前为止所做的:

import webapp2

form="""
    <form action="/testform">
        <input name="q">
        <input type="submit">
    </form>
"""

class MainHandler(webapp2.RequestHandler):
    def get(self):
        self.response.out.write(form)

class TestHandler(webapp2.RequestHandler):
    def get(self):
        q=self.request.get("q")
        self.response.out.write(q)

app = webapp2.WSGIApplication([
    ('/', MainHandler),('/testform',TestHandler)
], debug=True)

现在,如果我的理解是正确的,可以使用公钥解码使用私钥编码的令牌。这就是我在上面的代码中假设的,但是当我运行代码时,我得到了错误:

  

无法处理此令牌:签名无效

如果我使用相同的密钥进行编码和解码,则代码可以正常工作。

我想知道的是,我的理解或代码中有什么问题吗?

3 个答案:

答案 0 :(得分:3)

The JWT isn't signed using an asymmetric cipher like RSA. It uses a HMAC, which uses a single, secret key. Indeed, the point here is not to prove to someone else that you signed the token. It's to prove to yourself that you signed it, and thus forbid anyone who doesn't have your secret key to modify the token.

答案 1 :(得分:3)

您正在使用jwt.SigningMethodHMAC.因此,您使用HMAC进行签名,签名是由对称密钥(秘密)加密的令牌。

您应使用:jwt.New(jwt.SigningMethodRS256)使用非对称密钥对进行签名。

答案 2 :(得分:0)

非常有趣,因为我有类似的问题,当我有微服务和客户端应用程序需要验证来自另一个内部服务器的令牌,所以如果你建议使用HMAC而不是RSA他们意味着我需要将私钥放在微服务和客户端应用程序中?那不是一个严重的安全漏洞吗?