【发布时间】:2020-06-17 15:40:48
【问题描述】:
在对从客户端(在本例中为 React Native 应用程序)发送到我的服务器的数据有效负载进行签名时,我试图了解使用带有私钥/公钥 (RS512) 的 JSON Web 令牌的逻辑。
我认为私钥/公钥的全部意义在于将 private 密钥保密(在我的服务器上)并将 public 密钥交给成功登录的人进入应用程序。
我认为,对于我的服务器的每个 API 请求,经过身份验证的应用用户将使用 public 密钥创建 JWT(在客户端),服务器将使用 private 密钥,用于验证 API 请求的签名/有效负载。
似乎我把它弄反了,因为在我阅读的任何地方,您都应该使用 private 密钥签署 JWT ——但这与我对谁拥有密钥的理解背道而驰。
根据创建密钥的方式,一些私钥可以有一个本应保密的密码!因此,如果私钥和秘密是公开的(在客户端代码中),那么安全性如何?
加密从何而来?如果应用程序的用户在 API 中发送敏感数据,我是否应该在客户端加密有效负载并使用 JWT 对其进行签名,然后让服务器验证 JWT 签名并解密数据?
本教程很有帮助https://medium.com/@siddharthac6/json-web-token-jwt-the-right-way-of-implementing-with-node-js-65b8915d550e,但似乎倒退了。
任何解释肯定会有所帮助,因为所有在线教程都没有意义。
谢谢。
【问题讨论】:
-
JWT 通常不用于加密/解密有效负载。它们被郑重地用于认证和授权。您链接到的网站正确描述了该过程。用户在授权服务器上登录并接收到使用授权服务器的 private 密钥签名的 JWT 令牌。然后,用户将这个 JWT 附加到每个发送的请求中。然后,授权服务器通过 public 密钥验证其签名来验证 JWT 是否由该授权服务器颁发,以及它是否被某人篡改。
-
我认为您对两个不同的术语感到困惑;签名和加密。数据使用公钥加密并使用私钥解密。另一方面,您使用您的私钥对您的数据进行签名并使用您的公钥对其进行验证。
-
好的,但是为什么jwt.io 除了在 JWT 令牌(也就是签名)的第三部分中的公共密钥之外还包含私钥?
-
同意,在我的第二个示例中,不应使用 JWT 私钥。这种解决方案是不可接受的。我试图创建一种通过每个 API 调用刷新密钥的方法,但这并不理想。我将删除这部分答案。
-
@Lucian jwt.io 是一个检查、验证和创建令牌的工具。我猜想 除了 JWT 第三部分中的公共密钥之外,还包含私钥,您指的是右栏中的输入字段。您可以在此处插入私钥以签署令牌。当左侧有现有令牌时,只需在右侧插入公钥即可验证令牌,但如果添加私钥,则使用该私钥对令牌进行签名。
标签: jwt