如何使用 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 - 通过选择p
、q
、选择e
,然后求解d
,生成带有随机位的RSA密钥。还有一些其他的限制条件,比如确保p
和q
是素数,并且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(尽管存在其他合理的值),p
和 q
是随机生成的(虽然几乎所有 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 密钥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自定义绑定的 defaultAlgorithmSuite 中使用 RSA-SHA512 作为签名算法?
C# - 是不是可以使用 RSA SHA512 对哈希进行签名?