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

ygya80vv  于 2022-11-03  发布在  Node.js
关注(0)|答案(2)|浏览(430)

我的目标是使用jsonwebtoken verify方法验证JSON Web Token(JWT)格式的id_token,该方法需要一个公钥作为第二个参数。
根据Ping ID's documentation,我应该使用指数(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"
    },

问题是,我如何使用这些值生成公钥?有没有一个节点js库可以做到这一点?
我是密码学的新手,所以请原谅我的初学者问题。

6l7fqoea

6l7fqoea1#

您可以使用节点的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'
});

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

let pem = publicKey.export({ type: 'pkcs1', format: 'pem' });
jwt.verify(jwtToken, pem, (err, decoded) => {
})
deyfvvtc

deyfvvtc2#

如果你想使用jsonwebtokenverify方法,那么你可以通过将jwk转换为pem字符串来实现,例如,使用jwt-to-pem。使用package's website上的例子,它是这样的:
首先安装

npm i jwt-to-pem -D

然后你转换并使用

import * as jwtToPem from 'jwt-to-pem';
import {verify} from 'jsonwebtoken';

let jwk = {
    "kty": "RSA",
    "kid": "IlOPtWXUcpiPttmr-K7DmehzeRM",
    "use": "enc",
    "n": "qv2XCvfUfW0bG547B1...",
    "e": "AQAB"
};

let pem_str = jwtToPem(jwk);

//Finally, verification for some token
verify(id_token, pem_str);

我在nodecrypto文档中看到,你应该能够在没有外部依赖的情况下完成它,但是我没有管理它!

相关问题