Ich möchte einige Daten in einer Ruby-App verschlüsseln und dann in einer nodejs-App dekodieren. Ich habe versucht, dies zum Laufen zu bringen und jetzt versuche ich nur, das gleiche Stück Daten in beiden Sprachen zu verschlüsseln, um das gleiche Ergebnis zu erhalten, aber ich kann es nicht scheinen.
%Vor%Es sieht also so aus, als ob ich eine hexadezimale Zeichenfolge von der Kodierung bekomme.
%Vor%Gibt es ein Codierproblem, das ich vermisse? Ich habe versucht, Base64 decode e, aber das hat nicht das gleiche Ergebnis wie die Knoten-App. Irgendwelche Zeiger?
UPDATE: Also das ist so nah wie ein Freund und ich kann bekommen: Ссылка . Sheesh, ich möchte nur etwas in Ruby verschlüsseln und es im Knoten entschlüsseln.
UPDATE2: Alles klar, der Code in dieser Ausgabe bringt mich ziemlich weit: Ссылка
OK. Ich möchte allen danken, die mir geholfen haben. Im Grunde beantwortet dieser Thread hier meine Frage: Ссылка . Ich werde weitermachen und die beiden Programme veröffentlichen, für den Fall, dass jemand durch diese Rigamarole gehen muss. Denken Sie daran, dies ist nicht gemein, hardcore sicher zu sein, dies ist ein Sprungbrett für Ruby verschlüsseln Daten und Knoten entschlüsseln. Sie müssen mehr Maßnahmen ergreifen, um sicherzustellen, dass höhere Sicherheitsmaßnahmen ergriffen werden.
Der Code befindet sich in folgender Reihenfolge: Ссылка
Diese wurden auf Ruby 1.9.2p290 und Knoten 0.4.10
ausgeführtEs gibt einige subtile Dinge, die dies zum Scheitern bringen. Die wichtigste - Sie geben keine IV in Ihrem Code an, so dass ein zufälliger Wert für Sie generiert wird. Sie würden bemerken, dass Sie Ihren Chiffretext nicht einmal in der gleichen Programmiersprache auf diese Weise entschlüsseln können.
Sie müssen also beiden Implementierungen eine explizite IV bereitstellen. Aber bevor ich dir den Code zeige, gibt es einen Rat:
Schlüsselgenerierung :
Blowfish arbeitet auf 64-Bit-Blöcken, seine Schlüsselgröße variiert, aber OpenSSL (das derzeit sowohl die Verschlüsselungsimplementierung von Ruby als auch node.js antreibt) verwendet standardmäßig 128 Bit, also 16 Byte.
Also verletzt Ihr Schlüssel zwei Prinzipien - das erste: Es ist einfach zu lang. Es ist die hexadezimale Darstellung eines SHA-1-Hashes, das 20 Bytes * 2 = 40 Bytes anstelle von 16 ist. Die meiste Zeit ist das in Ordnung, weil die Implementierung die Werte entsprechend abschneidet, aber das sollten Sie nicht tun hängt davon ab.
Der zweite Fehler, viel schwerwiegender, ist, dass Sie anstelle der rohen Bytes die hexadezimale Darstellung verwenden: großes Sicherheitsproblem! Hexadezimalzeichen sind überhaupt nicht zufällig, also reduzieren Sie die Entropie Ihrer Eingabe auf die Hälfte der Länge (weil die zugrunde liegenden Bytes zufällig waren).
Eine sichere Methode zum Erzeugen zufälliger Schlüssel ist die Verwendung von OpenSSL :: Random
%Vor%Ein dritter Fehler besteht darin, Ihren Schlüssel in den Quellen fest codiert zu halten. Es ist eine schlechte Idee. Das Mindeste, was Sie tun sollten, ist es an einem anderen Ort im Dateisystem zu speichern, wo der Zugriff stark eingeschränkt ist. Siehe auch meine Antwort zu einer anderen Frage. Der Schlüssel sollte out-of-band gespeichert und nur dynamisch in der Anwendung geladen werden.
Chiffre :
Blowfish wird alt. Es gilt immer noch als ungebrochen in dem Sinne, dass Brute-Forcing der einzige Weg ist, es zu brechen. Aber ein Suchraum von 2 ^ 64 ist für findige Angreifer nicht unerreichbar. Sie sollten also tatsächlich zu AES übergehen.
Auffüllen :
OpenSSL-Pads, die standardmäßig PKCS5Padding (auch bekannt als PKCS7Padding) verwenden. Ruby profitiert davon und meine Wette ist, dass node.js das auch nutzt - also solltest du hier sicher sein.
Nun zur funktionierenden Lösung. Wir brauchen eine IV, Blowfish benötigt 64 Bit - 8 Bytes. Sie benötigen rbytes, um sichere Zufallszahlen im Knoten zu erhalten. Die IV kann in Ihren Quellen fest codiert sein (es sind öffentliche Informationen, keine Auswirkungen auf die Sicherheit) - aber es muss auf beiden Seiten gleich sein. Sie sollten einen Wert vorgenerieren und für node.js und Ruby verwenden.
%Vor%Jetzt der Ruby-Teil:
%Vor%Ihr Chiffretext wird einige zufällig aussehende Bytes sein. Diese Bytes können als hex, Base64 oder auf andere Weise ausgedrückt werden. Es sieht so aus, als ob Ihr Ruby-Code die rohen Bytes ausgibt. Ich schlage vor, dass Sie diese rohen Bytes in Hex konvertieren, um Ihren Vergleich zu machen.
Wenn Sie Ihren Code betrachten, sollten Sie auch von Blowfish ("bf") zu AES wechseln. Blowfish hat eine 64-Bit-Blockgröße und ist jetzt veraltet.
Sie tun gut, um das Auffüllen explizit anzugeben, PKCS7 ist häufig
Tags und Links ruby javascript node.js cryptography encryption