【发布时间】: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