2017-12-08 2 views
1

Ich habe den folgenden Code versucht, RSA-OAEP und A128GCM JWE Generator und Validator zu erstellen. es funktioniert mit node js, dh verschlüsseln forderungen und generieren die jwe und entschlüsseln das gleiche gibt mir die ansprüche. aber es funktioniert nicht mit den anderen Kunden, wie Nimbusds Jose, Jose4j. Also für sicher vermisse ich etwas.Wie generiert und validiere ich JWE in Knoten js?

ich diese https://tools.ietf.org/html/rfc7516

index.js durch das Lesen

var crypto = require('crypto'); 
var randomstring = require("randomstring"); 
var ursa = require("ursa"); 
var fs = require("fs"); 
var base64url = require('base64url'); 
var ascii = require("./ASCII"); 


var claims = { 
    firstName: "vimal" 
}; 

var header = { 
    "enc": "A128GCM", 
    "alg": "RSA-OAEP" 
}; 

var headerBase64Url = base64url.encode(JSON.stringify(header)); 
console.log("headerBase64Url : " + headerBase64Url); 
console.log("headerBase64Url to UTF8 : " + base64url.decode(headerBase64Url)); 


var cek = randomstring.generate(16); 
console.log("cek : " + cek); 

var publicKey = ursa.createPublicKey(fs.readFileSync('./pubkey.pem')); 
var encryptedKey = publicKey.encrypt(cek, 'utf8', 'base64'); 
console.log("encryptedKey : " + encryptedKey); 

// var privateKey = ursa.createPrivateKey(fs.readFileSync('./privkey.pkc8.pem')); 
// var decryptedKey = privateKey.decrypt(encryptedKey, "hex", "utf8"); 

// console.log("decryptedKey : " + decryptedKey); 


var iv = randomstring.generate(12); 
console.log("IV : " + iv); 
var cipher = crypto.createCipheriv('aes-128-gcm', cek, iv); 
cipher.setAAD(Buffer.from(ascii.toASCII(headerBase64Url))); 
var chipherText = cipher.update(JSON.stringify(claims), "utf8", "base64"); 
chipherText += cipher.final('base64'); 
console.log("chipherText : " + chipherText); 
var chipherTextAuthTag = cipher.getAuthTag().toString("base64"); 
console.log("chipherText Auth Tag : " + chipherTextAuthTag); 


var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(iv, "base64") + "." + base64url.encode(chipherText, "base64") + 
    "." + base64url.encode(chipherTextAuthTag, "base64"); 
console.log("jweToken : " + jweToken); 


// decrypt 

var jweTokenParts = jweToken.split("."); 

var headerHex = base64url.decode(jweTokenParts[0]); 
console.log(headerHex); 
var encryptedKeyHex = base64url.decode(jweTokenParts[1], "base64"); 
console.log(encryptedKeyHex); 
var ivHex = base64url.decode(jweTokenParts[2], "base64"); 
console.log(ivHex); 
var chipperTextHex = base64url.decode(jweTokenParts[3], "base64"); 
console.log(chipperTextHex); 
var chipherTextAuthTagHex = base64url.decode(jweTokenParts[4], "base64"); 
console.log(chipherTextAuthTagHex); 


var privateKey = ursa.createPrivateKey(fs.readFileSync('./privkey.pkc8.pem')); 
var decryptedKeyHex = privateKey.decrypt(encryptedKeyHex, "base64", "utf8"); 

console.log("decryptedKeyHex : " + decryptedKeyHex); 

var dcipher = crypto.createDecipheriv('aes-128-gcm', decryptedKeyHex, iv); 
dcipher.setAAD(Buffer.from(ascii.toASCII(jweTokenParts[0]))); 
dcipher.setAuthTag(Buffer.from(chipherTextAuthTagHex, "base64")); 
var planText = dcipher.update(chipperTextHex, "base64", "utf8"); 
planText += dcipher.final('utf8'); 
console.log(planText); 

ASCII.js

function toASCII(text) { 
    var ascii = ""; 
    for (var f in text) { 
     ascii = ascii + text.charCodeAt(f); 
    } 

    return ascii; 
} 

module.exports = { 
    toASCII: toASCII 
}; 

Öffentlichkeit generiert tue und einen privaten Schlüssel mit dem folgenden Befehl

openssl genrsa -out ./privkey.pem 2048

openssl pkcs8 -topk8 -Informiere pem -in ./privkey.pem -outform pem -nocrypt -out ./ privkey.pkc8.pem

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

Bitte helfen Sie mir diesen Code zu beheben.

Das ist mein öffentlicher Schlüssel

-----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 generiert

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

Können Sie uns den öffentlichen Schlüssel und ein Beispiel für JWE mitteilen? –

+0

@FlorentMorselli Ich bearbeitet die Frage mit dem öffentlichen Schlüssel und Token –

+0

Danke. Der Token ist korrekt gefälscht. Ich sehe 2 Möglichkeiten: Entweder ist der CEK nicht korrekt verschlüsselt oder der Decoder funktioniert nicht wie erwartet. Um die erste Annahme zu überprüfen, brauche ich den privaten Schlüssel. Für die zweite, können Sie versuchen, ein Token von einer anderen Anwendung erstellt zu laden (ich kann Ihnen eine in einem privaten Chat senden, wenn Sie wollen) –

Antwort

0

Es sieht aus wie die IV nicht richtig Base64 URL codiert wird, verwendet wird. Auf meinem Computer, wenn ich die folgende Codezeile ausführen:

console.log(iv); 
console.log(base64url.encode(iv, "base64")); 

identisch Dann sind die beiden Linien. Wenn ich Ihren Code ändern:

var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(iv, "base64") + "." + base64url.encode(chipherText, "base64") + 
"." + base64url.encode(chipherTextAuthTag, "base64"); 

lnto diese Richtung:

var bufferedIV = new Buffer(iv); 
var jweToken = headerBase64Url + "." + base64url.encode(encryptedKey, "base64") + "." + base64url.encode(bufferedIV, "base64") + "." + base64url.encode(chipherText, "base64") + 
"." + base64url.encode(chipherTextAuthTag, "base64"); 

Dann funktioniert es gut; Ich kann den resultierenden JWE mit meiner PHP-Bibliothek laden.

Aus meinem Verständnis stammt der Fehler von der Base64url-Abhängigkeit, die die IV nicht korrekt codiert.

+0

hi @Florent kann Bitte teilen Sie die PHP-Bibliothek mit mir.Ich habe versucht mit meinem Java-Code, es funktioniert nicht. :( –