智威汤逊公钥VS私钥签名确认 - 有什么区别?(JWT public key vs private

2019-09-26 03:11发布

我使用这个库, 节点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),并用它来验证,而不是有什么不同? (如实施例看到这个库 )

另外这里是用作示范从一个模数和指数(取自产生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签名为什么他们都存在吗? 什么是他们之间的平衡? 是一个比另一个更安全? 我应该使用哪种验证最全面?

Answer 1:

使用RSA不对称密钥对,智威汤逊与私钥签名,并与公众进行验证。 你不能用私有密钥验证数字签名

模量和指数是公开密钥的组件,你可以用它来建立PEM格式的公共密钥,这是DER二进制格式编码的公共密钥(模数和指数)的Base64表示。 您可以使用PEM,DER或模数和指数因为包含相同的信息

但任何人都不能建立与模数和指数私钥。 他需要的私人RSA元素,必须保密,所以没有人可以签署为您服务。



文章来源: JWT public key vs private key signature validation — what is the difference?