- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 JWT(JSON Web Token)方案的帮助下实现了一个登录系统。基本上,在用户登录/登录后,服务器对 JWT 进行签名并将其传递给客户端。
然后客户端在每个请求中返回 token ,服务器在发回响应之前验证 token 。
这几乎是您所期望的,但是我在流程的逻辑上遇到了一些问题。从我读过的所有数学文章中,似乎 RSA 签名使用非对称 key 进行签名。顾名思义,公钥向客户端公开,而私钥保存在服务器上,因此使用发送给客户端的公钥对 JWT 进行签名并在服务器端使用验证它是有意义的私钥。
但是,在每个示例和库中,我看到它似乎是相反的。知道为什么会这样吗?如果 JWT 使用私钥签名并使用公共(public) key 进行验证,那有什么意义呢?
最佳答案
首先,抱歉,这个答案很长。
如果您使用 RSA 对 token 进行签名,并且连接的客户端是 Web 浏览器,则客户端将永远不会看到 RSA key (公共(public)或私有(private))。这是因为客户端可能不需要验证 JWT 是否有效,只有服务器需要这样做。客户端只是持有 JWT 并在被询问时将其显示给服务器。然后服务器检查以确保它在看到 token 时有效。
那么,为什么您需要 JWT 的公钥/私钥组合呢?首先,您不需要使用公钥/私钥算法。
您可以使用多种不同的算法签署 JWT,RSA 就是其中之一。签署 JWT 的其他流行选择是 ECDSA 或 HMAC 算法(JWT 标准支持 others as well )。具体来说,HMAC 不是公钥/私钥方案。只有一个 key ,即 key ,用于对 token 进行签名和验证。您可以将其视为使用私钥对 JWT 进行签名和验证。无论如何,我都不是这方面的专家,但这是我最近通过自己的研究得出的结论:
使用 HMAC 很好,因为它是最快的选择。但是,为了验证 JWT,您需要给某人一个可以做所有事情的 key ,与其他人共享此 key 意味着该人现在也可以签署 token 并假装他们是您。如果您正在构建多个都需要能够验证您的 JWT 的服务器应用程序,您可能不希望每个应用程序也都具有签名 token 的能力(不同的程序员可能正在维护不同的应用程序,与更多人共享签名能力人是安全风险等)。在这种情况下,最好拥有一个严格控制的私钥(以及一个执行签名的应用程序),然后与其他人共享公钥,让他们能够验证 token 。在这里,私钥用于签署 token ,而公钥用于验证它们。在这种情况下,您需要选择 RSA 或 ECDSA。
As an example, you might have an ecosystem of apps that all connect tothe same database. To log users in, each app sends folks to one,dedicated, 'logging in' app. This app has the private key. The otherapps can verify that the person is logged in using the public key (butthey can't log people in).
关于rsa - 了解 JWT 的 RSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588319/
我目前正在使用 Crypto++ 为数据块生成签名。我希望签名是 20 个字节(SHA 1 Hash),因为我的理解是签名只是一个加密的哈希。但是当检查 maxsignaturelength 和 si
我不是加密专家,所以我对这些事情的了解接近于零。我必须与使用 RSA 加密的系统进行互操作。使用他们的 key 时,我遇到了为相同的输入/ key 获取不同密码的问题。图书馆是https://code
我想利用 postman 来测试需要使用 RSA 加密对输入字段之一进行加密的 REST API。 我看到 postman 通过 require('crypto-js') 提供了功能使用 AES 加密
我正在尝试在我的 (Java) 应用程序中实现一个(简化的)类似 RSA 的验证过程。客户端发送一个请求(数据+私钥签名),服务器要么拒绝他的请求,要么处理它——取决于签名的有效性。 但是我不明白验证
我正在尝试在我的 (Java) 应用程序中实现一个(简化的)类似 RSA 的验证过程。客户端发送一个请求(数据+私钥签名),服务器要么拒绝他的请求,要么处理它——取决于签名的有效性。 但是我不明白验证
下面是我想要做的最小、完整且可验证的示例。 基本上我想实现一个集成一些 CUDA 代码的 OpenSSL RSA 引擎。 CUDA 部分应该执行模幂运算,但在本例中并不重要,因此我只是按顺序使用了 B
是否有任何非常简单的跨平台 C++ 库可以进行不对称加密?不需要高效,只要工作。我想它可能只是 .h 文件中的 3-4 个函数,它们可以执行任意精度的数学运算,仅此而已。 我相信在这里使用 OpenS
我使用以下命令创建了私钥和公钥, openssl genrsa -out privatekey.pem 1024 openssl req -new -x509 -key privatekey.pem
我在 .net 环境(所有版本)中工作并使用 vb.net。我想根据密码生成 RSA 公钥和私钥。 我对 RSA 算法的理解仅限于使用 .net 提供的类,即 System.Security.Cryp
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有 ssh-keygen 生成的 id_rsa.pub key 。 如何以编程方式将 id_rsa.pub 文件转换为 RSA DER 格式的 key ? 最佳答案 如果使用 ssh-keygen
我在 JWT(JSON Web Token)方案的帮助下实现了一个登录系统。基本上,在用户登录/登录后,服务器对 JWT 进行签名并将其传递给客户端。 然后客户端在每个请求中返回 token ,服务器
我使用的是 WAS 6.1,我的服务器过去可以正常启动,但突然间无法正常工作.. 当我尝试在我的本地 RSA 中启动我的服务器时。我收到以下错误 我已经重新启动了系统,RSA,杀死了所有 Java 进
我正在开发一个支付网关,他们有一个正在运行的 Java 演示,但我想用 php 来实现它。 支付网关使用 3DES 和随机生成的 key 来加密有效负载。该 key 使用支付网关的公钥通过 RSA 进
这是此处未回答问题的副本:Using an RSA Public Key to decrypt a string that was encrypted using RSA Private Key 您可
我一直无法将 RSA 加密字节编码为字符串,然后在另一端(远程主机)将它们恢复为字节,另一端抛出“错误数据”异常。 我试过谷歌,没有运气。 到目前为止我的代码: 客户: array^Test=Enco
我需要一些帮助来解决我的问题。 问题:我想用 Android 平台的公共(public) RSA key 加密一个数字 (A),然后用私钥在 PHP 服务器上解密它。在每个平台上,我都可以加密和解密数
当我尝试将参数传递给函数时出现以下错误。 error[E0243]: wrong number of type arguments: expected 1, found 0 --> src/mai
我尝试将公共(public) RSA key 加载到我的程序中。我在 C 中使用 openssl 库。 key 在 header crypt.h 文件中定义: #define PUBLIC_KEY
Bouncy CaSTLe 加密库中有两种不同的密码可以传递给 PKCS1Encoding:NativeRSAEngine 和 RSAEngine。这两个变体之间有区别吗? 编辑: 正如 Maarte
我是一名优秀的程序员,十分优秀!