Javascript 如何在NodeJS中生成和验证JWE?

Javascript 如何在NodeJS中生成和验证JWE?,javascript,node.js,encryption,jwe,Javascript,Node.js,Encryption,Jwe,我尝试了下面的代码来创建RSA-OAEP和A128GCM JWE生成器和验证器。它与node js一起工作,即加密声明并生成jwe,然后对声明进行解密。但它并没有和其他客户合作,比如nimbusds jose、jose4j。所以我肯定错过了一些东西 我是通过阅读来做到这一点的 index.js ASCII.js 使用以下命令生成公钥和私钥 openssl genrsa-out./privkey.pem 2048 openssl pkcs8-topk8-通知pem-in./privkey.pem-

我尝试了下面的代码来创建RSA-OAEP和A128GCM JWE生成器和验证器。它与node js一起工作,即加密声明并生成jwe,然后对声明进行解密。但它并没有和其他客户合作,比如nimbusds jose、jose4j。所以我肯定错过了一些东西

我是通过阅读来做到这一点的

index.js

ASCII.js

使用以下命令生成公钥和私钥

openssl genrsa-out./privkey.pem 2048

openssl pkcs8-topk8-通知pem-in./privkey.pem-出口pem-nocrypt-out./privkey.pkc8.pem

openssl rsa-in./privkey.pkc8.pem-pubout-out./pubkey.pem

请帮我修复这个代码

这是我的公钥

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyT0HZHrlk8nN8HfTDq5t
dv6UCKHf7+RF1bICxaR4h2vzGCqcYUlzyW7Sp33BZAHDeO3d5tX26m7z2EOPaOPn
SSe6psgvBmE4Ivyc3+uyIYJm+Eo9bXiqqfvuDRidXsHj23w41l6GMERKbpOBVvp+
dmWt/cWU8FESvKUqNw/Au2R9mE1sQ5irMQj42hhUrVA1azs2AYpysKNZABm11YMb
/vd/xSPLsNqcDefuCs7j3CcT9xNLrMV6K63QjCAP+h0IMuA+ayi3WRUbl04D6cAC
AC97/cKMC0YLRumbf5x5/KjUBwNlzgRA3/n9KE+YjJ9Rs9dtiGnlg+c70Kgx4hm9
9QIDAQAB
-----END PUBLIC KEY-----
生成JWE

eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiUlNBLU9BRVAifQ.A_KMJqfr6FZSoejRGWPsZKMCNZmPyaWoNvpG6KMRpqyv7Alb8Ui5ELWLjpcaemjNM8EFU8d4-Yzz8jRRZ5TpK2pEEc4NXfDLcnj2b0-38_-P-0HbW1YyMkkGMVXIpJDYMo8vKgVHIBj0pNlzgF7xmxLFWZlJlXmYzXi4QZcig5HezHg7AAQB7U2HYry25cQDYam60747gRCH372NaSm_dfRCNvH8copVXqiJGNs6xhslxMt_LopnZt9iIcAC9o7m0FPdnu_0Ui_w0jp5OUam8i0v8k6SSajBvXSedtUENxcehPGRSFYzi8KqZ53u4CpRygir84wNFRTi7zmLV6TlVw.84xgyx6TTI8I.4zTt1fI1XCbvxW2L-pH8_Mfp_ySF.EPmpEHiMYAvA2nqz9M0v5Q

看起来IV没有使用Base64 Url正确编码。 在我的计算机上,当我执行以下代码行时:

console.log(iv);
console.log(base64url.encode(iv, "base64"));
那么这两条线是相同的。 当我修改您的代码时:

var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(iv, "base64") + "." + base64url.encode(chipherText, "base64") +
"." + base64url.encode(chipherTextAuthTag, "base64");
请注意以下几行:

var bufferedIV = new Buffer(iv);
var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(bufferedIV, "base64") + "." + base64url.encode(chipherText, "base64") +
"." + base64url.encode(chipherTextAuthTag, "base64");
然后它工作得很好;我可以使用我的PHP库加载生成的JWE


据我所知,错误来自base64url依赖项,该依赖项没有正确编码IV。

您能与我们分享公钥和JWE的示例吗?@FlorentMorselli我用公钥和令牌编辑了问题谢谢。令牌是正确伪造的。我看到了两种可能性:要么CEK没有正确加密,要么解码器没有按预期工作。为了验证第一个假设,我需要私钥。对于第二个,您可以尝试加载由另一个应用程序创建的令牌(如果您愿意,我可以在私人聊天中向您发送令牌)@FlorentMorselli是的,请,我的电子邮件ID:vimalprakashts@gmail.comhi@Florent你能和我分享一下php库吗。我尝试使用Java代码,但它不起作用:(
var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(iv, "base64") + "." + base64url.encode(chipherText, "base64") +
"." + base64url.encode(chipherTextAuthTag, "base64");
var bufferedIV = new Buffer(iv);
var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(bufferedIV, "base64") + "." + base64url.encode(chipherText, "base64") +
"." + base64url.encode(chipherTextAuthTag, "base64");