如何使用指数 (e) 和模数 (n) 生成 RSA 公钥来验证 json Web 令牌的签名?

Zhe*_* Ng 4 rsa node.js public-key jwt jwk

我的目标是使用jsonwebtoken verify 方法以 JSON Web Token (JWT) 格式验证我的 id_token ,该方法需要公钥作为第二个参数。我的 Web 应用程序是一个 Node.js 应用程序。

根据Ping ID 的文档,我应该使用指数(e)和模数(n)生成 RSA 公钥。这是适用于我的 id_token 的示例:

   {
    "kty": "RSA",
    "kid": "IlOPtWXUcpiPttmr-K7DmehzeRM",
    "use": "enc",
    "n": "qv2XCvfUfW0bG547B1xieE0-GN8xLuCdzGcIWsYMP-fn1vR2ptR7XOp_kW-etlxSDT2MVyzdXbG9eQCgeBk-Ajgbyn4AaFScJt9ibGyE-5hUvkSJRTP-jlJjlPniYsKcjEY3C-QzyRcEIHoOHOEuevIFwVvKNRgEVYyx3CmkmIXcfw35R1tORNjCec_NA6dawx_LPpS0endjNz2m_iijLquKenrsKSKVnBprfVtBh_myuNQD5CfhBnzZRmAUfr0PoVMDBb0r_rWaV1Q64zQWSeCql7CSWq4U8RNhogd0eCZOOv45plIUwoxkdNg0Rzkp-OEtKRLaHonJ_OZ_sxa8-w",
    "e": "AQAB"
    },
Run Code Online (Sandbox Code Playgroud)

问题是,如何使用这些值生成公钥?有没有一个 Node.js 库可以做到这一点?

我是密码学新手,所以请原谅我的初学者问题。

agr*_*ton 6

您可以使用节点的 Crypto 模块轻松地将 jwk 转换为公钥(pem),而无需使用外部依赖项。

import crypto from 'crypto';

let publicKey = crypto.createPublicKey({
  key: {
    "kty": "RSA",
    "kid": "IlOPtWXUcpiPttmr-K7DmehzeRM",
    "n": "qv2XCvfUfW0bG547B1xieE0-GN8xLuCdzGcIWsYMP-fn1vR2ptR7XOp_kW-etlxSDT2MVyzdXbG9eQCgeBk-Ajgbyn4AaFScJt9ibGyE-5hUvkSJRTP-jlJjlPniYsKcjEY3C-QzyRcEIHoOHOEuevIFwVvKNRgEVYyx3CmkmIXcfw35R1tORNjCec_NA6dawx_LPpS0endjNz2m_iijLquKenrsKSKVnBprfVtBh_myuNQD5CfhBnzZRmAUfr0PoVMDBb0r_rWaV1Q64zQWSeCql7CSWq4U8RNhogd0eCZOOv45plIUwoxkdNg0Rzkp-OEtKRLaHonJ_OZ_sxa8-w",
    "e": "AQAB"
  }, format: 'jwk'
});
Run Code Online (Sandbox Code Playgroud)

然后您可以使用它来验证 jwt。

let pem = publicKey.export({ type: 'pkcs1', format: 'pem' });
jwt.verify(jwtToken, pem, (err, decoded) => {
})
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,很难找到这样的例子。我已经用我的 JWKS 和令牌集对此进行了测试,它按预期工作。这应该是公认的答案 (2认同)