【问题标题】:Should I use a public key or private key to generate modulus and exponent for a JWKS endpoint?我应该使用公钥还是私钥来为 JWKS 端点生成模数和指数?
【发布时间】:2019-08-08 06:02:29
【问题描述】:

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

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

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

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')

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

【问题讨论】:

    标签: javascript authentication jwt rsa node-rsa


    【解决方案1】:

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

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

    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')
    

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

    进一步研究一下,公钥和私钥share the same modulus。因此,两种情况下的模数相同是有道理的。另外,我从node-rsa 文档中得到的印象是e 是公共指数。所以componentscomponents-public 将为e 返回相同的值。此外,此值将始终为65537,因为根据RSA

    签名算法应该使用 65537 的公共指数。

    因此,结论是您应该使用公共模数和指数。但如果您使用node-rsaexportKey 在任何一种情况下都会返回共享模数和公共指数。

    【讨论】:

    • @maarten-bodewes 你有空的时候可以在这里写一个很好的答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 2011-07-11
    • 1970-01-01
    • 2015-06-22
    • 2014-08-16
    • 2023-03-21
    • 2016-09-15
    相关资源
    最近更新 更多