当前位置: 首页 > 知识库问答 >
问题:

JWT公钥与私钥签名验证——有什么区别?

宣望
2023-03-14

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

在引擎盖下,它使用此方法构建公钥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文件中的html" target="_blank">参数)。

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

这种验证方法与根据jwks的模和指数生成私钥(RSA)有何不同。json文件,并将其用于验证?(示例请参见此库)

此外,这里是作为演示的功能,从mod和指数(取自http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js)生成PEM

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签名,为什么它们都存在?他们之间的权衡是什么?一个比另一个更安全吗?我应该用哪个来最充分地验证?

共有1个答案

陶树
2023-03-14

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

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

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

 类似资料:
  • 另外,这里还有一个函数演示,它从mod和指数生成PEM(摘自http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js) 前面提到的jsonwebtoken库可以使用任何一种方法来验证JWT--但是为什么呢?如果这两种验证方法都可以验证一个JWT签名,为什么它们都存在呢?他们之间有什么权衡?一个比另一个更安全吗?我应该使用哪一

  • 本文向大家介绍公钥和私钥有什么区别?相关面试题,主要包含被问及公钥和私钥有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 回答:在区块链中,需要使用公钥进行标识,而使用私钥进行加密和身份验证。发送方可以使用接收方的公钥发送消息,而接收方可以使用私钥对消息或交易进行解密。通过同时使用两个密钥,可以确保通信或交易的安全和防篡改。

  • 如何验证公钥与私钥匹配? 在应用程序启动时,从base64 PEM编码字符串加载2048位RSA密钥。我希望在继续之前验证密钥是否有效以及是否匹配。签名和验证由我使用的下划线库完成。 我可以签署和验证虚拟数据,但我正在寻找替代解决方案。 首发操场:https://play.golang.org/p/tsB8Yp-xs47

  • 我想验证一些来自Microsoft的JWT的签名。我正在使用Spring-Boot、JJWT库和以下endpoint:https://login.microsoftonline.com/common/discovery/v2.0/keys endpoint返回JSON公钥数组。下面是数组中的一个示例。

  • 我想知道在spring boot security中使用公钥和私钥创建和验证JWT签名的过程。 我试图使用HMAC算法验证JWT令牌。我正在用硬编码的秘密“秘密”构建JWT。 解析代码的步骤如下 我想使用公钥和私钥,而不是使用签名密钥作为“秘密”

  • Auth0提供了两个JWT库,一个用于Node:Node jsonwebtoken,另一个用于Java:Java JWT。 我创建了私有/公钥对,并在Node中成功地使用了node-jsonwebToken: 但是我发现没有办法在java-jwtJava做同样的事情。 有人有一个如何在Java中为JWT使用私钥/公钥的工作示例吗?