Node.js (JWT)RSA加密/解密问题

Node.js (JWT)RSA加密/解密问题,node.js,encryption,cryptography,jwt,Node.js,Encryption,Cryptography,Jwt,我有一个特殊的问题,我遵循一个关于加密JWT的教程 给定以下代码: const crypto=require('crypto'); const jwt=require('jsonwebtoken'); const密码短语='diogenes'; const{publicKey,privateKey}=crypto.generateKeyPairSync('rsa'{ 模长:4096, 公钥编码:{ 类型:“spki”, 格式:“pem” }, 私钥编码:{ 类型:“pkcs8”, 格式:“pem

我有一个特殊的问题,我遵循一个关于加密JWT的教程

给定以下代码:

const crypto=require('crypto');
const jwt=require('jsonwebtoken');
const密码短语='diogenes';
const{publicKey,privateKey}=crypto.generateKeyPairSync('rsa'{
模长:4096,
公钥编码:{
类型:“spki”,
格式:“pem”
},
私钥编码:{
类型:“pkcs8”,
格式:“pem”
}
});
常量符号=({messageId,tradeId,sessionToken})=>{
const token=jwt.sign(
{messageId,tradeId,sessionToken},
密码短语,
{expiresIn:'10h'}
);
返回令牌;
};
const verify=(jwtToken)=>{
const token=jwt.verify(jwtToken,密码短语);
返回令牌;
};
const signedToken=sign({messageId:'1',tradeId:'2',sessionToken:'3'});
const encryptedToken=crypto.publicEncrypt(公钥、缓冲区、发件人(signedToken,'base64'));
const decryptedToken=crypto.privateDecrypt(privateKey,encryptedToken);
log(decryptedToken.toString('base64');
控制台日志(signedToken);
我从解密中得到的值略有不同,差别不大,但足以使令牌不可验证

例如:

EYJHBGCIOIJIUZI1NIISINR5CCI6IKPXVCJ9EYJTZXNZYWDLSWQOIIXIIWIDHHZGVZCI6IJIILCJZZZZZZZZAW9UVG9RZW4IoIoIiIiIiIiIiIiIiIiIiIw0IOxNtuxMdU4LcJlEhIoIoIoIoIoIoIoj1NzM1OdCw9ZZZIgIgIgZZZZH8JZZZL8JgLcZLjJ

与原始版本相比:

EYJJBGCIOIJIUZI1NIISINR5CCI6IKPXVCJ9.EYJZXNZYWDLSWQIIIXIIWIDHHZGVJZI6IJIILCJZZZZZZZAW9UVG9RZW4I0I0I0I0I0I0XNTCZU4LJLEHAI0NZM1ODCWNTH9.ZXIJSO8EXSOSMUGLZH8JGCLJKYKIZBJ6MZLMAG

这里发生了什么?

JSON Web令牌(JWT)由三个部分组成,三个部分由一个点(头、负载、签名)分隔,每个部分都是Base64Url编码的,请参阅。因此,
signedToken
不能用以下语句读入缓冲区:

Buffer.from(signedToken, 'base64')
它只需要一个Base64编码字符串()。最简单的方法是在读取缓冲区时使用-编码(对应于拉丁1或ISO-8859-1编码),因为各个部分是Base64编码的,因此与此编码兼容:

const encryptedToken = crypto.publicEncrypt(publicKey, Buffer.from(signedToken, 'binary'));
对于输出:

console.log(decryptedToken.toString('binary'));

那么两个输出都是相同的。

它们有什么不同,有什么例子吗?我已经更新了这个例子。