Verschlüsseln von Strings in PHP und entschlüsseln in Node.js
Ich bin das senden von Daten über unsichere Verbindung zwischen Apache und Node.js Server. Ich brauche, um Daten zu verschlüsseln in PHP und entschlüsseln in Node.js. Ich habe 2 Tage versucht es zum laufen zu bringen, aber es gelang mir nur um die Nachrichtensignatur zu arbeiten, keine Verschlüsselung. Ich habe versucht, die übergabe AES128-CBC, AES256-CBC, DES, AES128, AES256, wie algorithmen, aber nichts funktionierte gut..
Habe ich versucht, dieses in PHP:
$data = json_encode(Array('mk' => $_SESSION['key'], 'algorithm' => 'SHA1', 'username' => $_SESSION['userid'], 'expires' => $expires));
$payload = openssl_encrypt($data, 'des', '716c26ef');
return base64_encode($payload);
Und in Node.js:
var enc_json = new Buffer(response[1], 'base64');
var decipher = crypto.createDecipher('des', '716c26ef');
var json = decipher.update(enc_json).toString('ascii');
json += decipher.final('ascii');
Und außerdem falsch entschlüsselten Daten bekomme ich Fehlermeldung wie diese:
TypeError: error:0606508A:digital envelope routines:EVP_DecryptFinal_ex:data not multiple of block length
TypeError: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
Brauche ich eine einfache Verschlüsselung, da die Daten nicht zu empfindlich (kein Passwort oder user-Daten), jedoch sollten die Daten nur vom Empfänger gelesen werden. Die Schlüssellänge kann alles sein, aber-Verfahren zum verschlüsseln/entschlüsseln muss so einfach wie möglich, bitte keine IVs.
- Warum können Sie nicht verwenden, HTTPS?
- Sollten Sie nicht zurückkehren
base64_encode($payload);
? - Ich bin.. ich war die Bearbeitung Variablennamen für die Frage.
- es ist Dritte diese: Daten geht an den client, wo es für die zukünftige Verwendung gespeichert oder gesendet werden Node.js server sofort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim Umgang mit der symmetrischen Verschlüsselung wie dieser, der erste Schritt ist das erkennen, dass es wahrscheinlich ein großer Schmerz in der Rückseite - ich habe nie, nie hatte es sofort funktioniert, selbst wenn ich copy & Paste meinen eigenen code. Dies liegt hauptsächlich daran, Verschlüsselungs-und Entschlüsselungs-Methoden sind, durch design, äußerst nachtragend und geben selten eine nützliche Fehlermeldung aus. Eine einzige null-Zeichen, carriage return, line-feed, oder dynamisch umgewandelt Art kann automatisch Schlag den gesamten Prozess.
Dies zu wissen, Fortschritt stufenweise auf. Ich schlage vor, die folgenden:
Ersten, PHP alleine funktioniert. Übergeben Sie text, verschlüsseln Sie es, sofort entschlüsseln, und vergleichen Sie es mit der strengen Gleichheit der ursprünglichen Klartext-variable. Sind Sie vollkommen gleich? Ausgang sowohl, als auch - Sie sind in der gleichen Art und erscheinen vollkommen unbehelligt? Watch out für nicht gedruckte Zeichen - überprüfen Sie die Länge und die Zeichen-Kodierung!
Nun, das oben mit einem weitere Beispiel-text, 1 Zeichen mehr oder weniger als die Vorherige. Diese debug-block Größe/zero-padding Fragen - es ist wichtig.
Wenn das funktioniert - und es tut selten sofort, für schwer vorherzusagen Gründe, weiterhin Node.js.
In Node.js das gleiche tun, wie in PHP, auch wenn es scheint, dass sich der Aufwand - für extra Gründen, die gleich offensichtlich werden, in einem Augenblick. Verschlüsseln und entschlüsseln Sie, alle zusammen, in Ihrer Node.js. Funktioniert es mit allen die gleichen Vorbehalte, die oben gegeben?
Sobald das erledigt ist, kommt hier der 'Spaß' - Teil: mit der gleichen Verschlüsselung Methoden selbstständig in Node.js und PHP, haben Sie beide Ausgang, um Ihnen die 'letzten' ready-to-transmit-cryptext, dass beide produziert.
Wenn alles gut ist, Sie sollten perfekt sein, genau das gleiche. Wenn Sie nicht, Sie haben ein problem mit Ihrem Verschlüsselungs-Implementierungen und Methoden, die nicht kompatibel zwischen den Systemen. Irgendeine Einstellung ist falsch oder widersprüchlich (vielleicht mit null Polsterung oder eine Vielzahl von anderen Möglichkeiten, oder IV, etc), oder müssen Sie versuchen, eine andere Umsetzung.
Wenn ich raten müsste blind, ich würde sagen, es ist ein Problem mit der base64-Kodierung und-Dekodierung (es ist meist was schief geht). Dinge neigen dazu, sich zweimal getan, weil es kann schwierig sein, zu debug-binary-Datentypen in web-Anwendungen (über einen browser). Manchmal sind die Dinge codiert zweimal, sondern nur einmal decodiert, oder eine Implementierung wird 'hilfreich' codieren/decodieren etwas automatisch, ohne dass klar ist, was es tut, etc.
Es ist auch möglich, es ist eine zero-padding-Implementierung Problem zwischen Knoten und PHP, wie hier vorgeschlagen: AES verschlüsseln, in Node.js Entschlüsseln in PHP. Fail.
Diese letzten beiden Punkte sind dringend empfohlen, von Ihrem Fehler-codes. Die Verschlüsselungs-Methoden vorherzusagen, block-Größen exakte Länge, und wenn Sie dann wieder aus, dass die Signale der Korruption der Daten, die an die Funktionen übergeben werden - was passiert, wenn ein einzelnes zusätzliches Zeichen reingerutscht, oder wenn die Kodierung wird anders behandelt, etc.
Wenn Sie Schritt für Schritt durch jede der oben ein zu einer Zeit, versichert Sie können nicht überstürzen und müssen schauen aufwändiger kleinen Schritt des Prozesses, es sollte viel mehr klar, wo genau die Dinge schief gehen, und dann können Sie troubleshooted.
Dies ist codeiginiter Rahmen Standard Entschlüsselung gleichwertiges js-script (aes128cbc), hoffe, das hilft jemand.