我应该使用 public 密钥还是私钥来为 JWKS 端点生成模数和指数?

Should I use a public key or private key to generate modulus and exponent for a JWKS endpoint?

我尝试搜索此问题的答案,但没有找到任何答案。所以,我在问和回答。

我正在尝试实施 JWKS 端点。我找到了一些示例代码 here。请注意,作者对该回购协议的意图只是测试。他很清楚,他对加密的了解还不够多,无法知道它是否真的安全。

示例中私钥用于生成模数和指数:

const forge = require('node-forge')
const NodeRSA = require('node-rsa')

const helperKey = new NodeRSA()
helperKey.importKey(forge.pki.privateKeyToPem(privateKey))
const { n: modulus, e: exponent } = helperKey.exportKey('components')

由于这些值随后 public 可用(通过 JWKS 端点),模数和指数是否可以用于以某种方式获取私钥?我应该使用 public 键来生成模数和指数吗?

TL;DR:您应该使用 public 模数和指数

我尝试使用 public 键生成模数和指数,在 JWKS 端点中使用它们,并且成功了;它验证了 JWT。这是使用 public 键生成模数和指数的样子:

const forge = require('node-forge')
const NodeRSA = require('node-rsa')

const helperKey = new NodeRSA()
helperKey.importKey(forge.pki.publicKeyToPem(publicKey))
const { n: modulus, e: exponent } = helperKey.exportKey('components-public')

由于使用两者进行验证,这让我怀疑使用 public 或私钥时模数和指数相同。我比较了使用两个键生成的模数和指数,它们是相同的。

再仔细研究一下,public 和私钥 share the same modulus. So it makes sense that the modulus is the same in both cases. Also, the impression I get from the node-rsa documentation is that e is the public exponent. So components and components-public will return the same value for e. Furthermore, this value will always be 65537 because, according to RSA:

The signing algorithm SHOULD use a public exponent of 65537.

因此,结论是 您应该使用 public 模数和指数 。但是,如果您使用 node-rsaexportKey 将 return 共享模数和 public 指数。