【问题标题】:JWT public key vs private key signature validation -- what is the difference?JWT 公钥与私钥签名验证——有什么区别?
【发布时间】:2018-04-10 12:33:32
【问题描述】:

我正在使用这个库 node-jwks-rsa 从我的 auth0 jwks.json 文件中获取 JWT 密钥,以验证我的应用程序在身份验证后检索到的 id_token 实际上来自我的身份验证提供程序。

在底层它使用这种方法来构建一个公钥 PEM

export function certToPEM(cert) {
  cert = cert.match(/.{1,64}/g).join('\n');
  cert = `-----BEGIN CERTIFICATE-----\n${cert}\n-----END CERTIFICATE-----\n`;
  return cert;
}

(使用 x50c 作为 .jwks 文件中的参数)。

然后我将其与jsonwebtoken 结合使用以验证 JWT(id_token) 是否有效。

这种验证方法与从 jwks.json 文件的模数和指数生成私钥 (RSA) 并将其用于验证有何不同? (例如看到这个library

此外,这里还有一个演示函数,它从模数和指数生成 PEM(取自 http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js

export function rsaPublicKeyToPEM(modulusB64, exponentB64) {
    const modulus = new Buffer(modulusB64, 'base64');
    const exponent = new Buffer(exponentB64, 'base64');
    const modulusHex = prepadSigned(modulus.toString('hex'));
    const exponentHex = prepadSigned(exponent.toString('hex'));
    const modlen = modulusHex.length / 2;
    const explen = exponentHex.length / 2;

    const encodedModlen = encodeLengthHex(modlen);
    const encodedExplen = encodeLengthHex(explen);
    const encodedPubkey = '30' +
      encodeLengthHex(modlen + explen + encodedModlen.length / 2 + encodedExplen.length / 2 + 2) +
      '02' + encodedModlen + modulusHex +
      '02' + encodedExplen + exponentHex;

    const der = new Buffer(encodedPubkey, 'hex')
      .toString('base64');

    let pem = `-----BEGIN RSA PUBLIC KEY-----\n`;
    pem += `${der.match(/.{1,64}/g).join('\n')}`;
    pem += `\n-----END RSA PUBLIC KEY-----\n`;

    return pem;
  };

前面提到的jsonwebtoken 库可以使用任何一种方法来验证 JWT——但为什么呢?如果这两种验证方法都可以验证 JWT 签名,为什么它们都存在?它们之间的权衡是什么?一个比另一个更安全吗?我应该使用哪个来最全面地验证?

【问题讨论】:

  • 只有公钥(已配置)用于签名验证。在后台,两个库都需要计算哈希并验证哈希签名。在正确完成验证之前,没有理由比另一个更安全。
  • @gusto2 - 我仍然很困惑。为什么jwt.io 的交互式调试器允许使用我上面描述的两种方法进行 JWT 签名验证,如果只使用公钥,则使用公共和私有?
  • 您无法使用私钥验证数字签名。不清楚你在问什么。

标签: authentication rsa jwt digital-signature auth0


【解决方案1】:

使用 RSA 非对称密钥对,使用私钥对 JWT 进行签名并通过公钥进行验证。您无法使用私钥验证数字签名

模数和指数是公钥的组成部分,您可以使用它来构建 PEM 格式的公钥,它是以 DER 二进制格式编码的公钥(模数和指数)的 base64 表示。您可以使用 PEM、DER 或模数和指数,因为它们包含相同的信息

但是任何人都无法使用模数和指数来构建私钥。他需要私有的 RSA 元素,这些元素必须保密,这样没有人可以为你签名。

【讨论】:

  • 谢谢佩德罗。从 OpenId 流的角度来看,您是否有任何关于 jwk/s 的所有不同字段与此相关的信息的链接?即x50c的来源。我想扩展我的知识和理解。
  • OpenIdConnect 或 Oauth2 与 JWK (JsonWebKey) 无关。 JWK 是一种表示此 RFC tools.ietf.org/html/rfc7517 中定义的加密密钥的格式。似乎JKWS 是一个Auth0 的概念代表一组JWK 的JSON 对象x5c 属性是包含公钥的 X509Certificate
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 2017-11-22
  • 2018-11-14
  • 1970-01-01
  • 2013-05-28
  • 2018-05-22
相关资源
最近更新 更多