如何使用 sha512 为 JWT 生成 RSA 密钥?

Posted

技术标签:

【中文标题】如何使用 sha512 为 JWT 生成 RSA 密钥?【英文标题】:How to generate RSA key using sha512 for JWT? 【发布时间】:2017-11-05 00:08:23 【问题描述】:

我了解可以使用不同的sha 算法生成 RSA 密钥。使用openssl,我似乎无法指定密钥生成器应该使用什么算法。我怀疑它使用的是sha256

如何在 bash shell 或 Ruby 中使用不同的 sha 算法(例如 sha512)生成 RSA 密钥? openssl 库是否支持使用不同算法生成 RSA 密钥?如果没有,有人知道我可以使用的另一个库吗? (在 ruby​​ 中,OpenSSL::PKey::RSA 似乎不允许选择算法,但 documentation 对我来说很难遵循...?)

抱歉,如果这个问题已经得到解答,但我无法找到答案。

也许我还应该注意(以防我错了):我的理解是为生成的 RSA 密钥(即RSA 2048)选择大小与选择散列算法(即sha512)是分开的。

更新 - 一些背景

我想用 RSA 密钥签署 Java Web 令牌。我使用的JWT library 给我的印象是可以使用不同的散列算法(RS256、RS384、RS512)生成 RSA 密钥。使用openssl 生成密钥似乎并不能让我选择使用什么散列算法。

谢谢!!

【问题讨论】:

我不确定您所说的“使用 sha 算法生成 RSA 密钥”是什么意思。 RSA 密钥是使用精心设计的加密随机数生成器生成的。在幕后,这些可能会使用像 sha512 这样的加密哈希函数作为算法的一部分,但出于密钥生成的目的,您通常会将它们视为黑盒。 @JamesKPolk - 我猜测(它只是一个猜测)它是:(1)底层 PRNG(如 Java 使用 SHA1 处理 SecureRandom);或 (2) 与数字签名相关的签名算法(如证书中使用的)。无论哪种情况,我认为我们都需要更多信息或澄清。 @John - 通过选择pq、选择e,然后求解d,生成带有随机位的RSA密钥。还有一些其他的限制条件,比如确保pq 是素数,并且eϕ(n) 的相对素数或互素数。在此过程中不使用哈希。 @jww,您知道为什么 JWT 库 github.com/jwt/ruby-jwt 会要求我指定使用什么哈希算法生成 RSA 密钥吗?听起来您在说每个 RSA 密钥生成库(例如openssl)只允许您选择密钥中的位数,而不是使用的算法。谢谢! @John - 当部分声明 “RS256 - RSA 使用 SHA-256 哈希算法” 时,RSA 密钥已经生成。签名过程中使用了 SHA 和其他哈希值;不是 RSA 密钥生成过程。 【参考方案1】:

RSA 密钥,而“RSA 算法”没有任何哈希算法的概念。

一个 RSA 密钥只是两个素数和一个其他数字(可以从 (p, q, e) 三元组推导出所有其他值)。 e 通常被选为 0x010001(尽管存在其他合理的值),pq 是随机生成的(虽然几乎所有 CSPRNG 都会有一个支持哈希算法,但 CSPRNG 本身通常被认为是一个黑盒子,它只是发出随机性)。

哈希算法发挥作用的地方在于 RSA 签名

对于 RSA 签名,原始数据在算法下进行哈希处理,然后使用哈希值、算法标识符和私钥生成签名(对于 PKCS v1.5 签名......对于 PSS,还有第二个(有效地固定)标识符和一些更多的随机字节)。

RS256 是“RSASSA-PKCS1-v1_5 的 JWA (JSON Web Algorithms) 标识符,使用 SHA(-2)-256”。

JWA section 3.3 说

本节定义了 RSASSA-PKCS1-v1_5 数字的使用 RFC 3447 [RFC3447] 第 8.2 节中定义的签名算法 (通常称为 PKCS #1),使用 SHA-2 [SHS] 哈希函数。

这些算法必须使用大小为 2048 位或更大的密钥。

RSASSA-PKCS1-v1_5 SHA-256 数字签名生成为 如下:使用生成 JWS 签名输入的数字签名 RSASSA-PKCS1-v1_5-SIGN 和具有 所需的 SHA-256 哈希函数 私钥。这是 JWS 签名值。

(强调我的)

因此对 RSA 密钥没有任何要求,除了规范是在 2015 年编写的,因此他们规定了与 2015 年兼容的最小密钥大小。

【讨论】:

感谢您的详细回复!! @jww 昨天在评论(上)中回答了我的问题,但这是一个更详细的答案。我(以前)忘记了 RSA 生成和 RSA 签名之间的区别。

以上是关于如何使用 sha512 为 JWT 生成 RSA 密钥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RSA、AES 和 JWT 进行安全授权?

如何使用 RSA512 算法创建签名的 JWT

如何在自定义绑定的 defaultAlgorithmSuite 中使用 RSA-SHA512 作为签名算法?

C# - 是不是可以使用 RSA SHA512 对哈希进行签名?

RSA.SignHash SHA512 和 SHA256 给出相同的签名长度

在 RESTful API 的上下文中,使用 RSA 签署 JWT 比 SHA 有啥优势?