2010-12-21 4 views
8

Ich habe seltsame Probleme mit Krypto-Bibliothek Knoten. Ich schrieb diesen einfachen AES Testskript:Node.js und Krypto-Bibliothek

var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8') 
var text = "123|123123123123123"; 
cipher.update(text,'utf8','hex') 
var crypted = cipher.final('hex') 
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8') 
decipher.update(crypted,'hex','utf8') 
var dec = decipher.final('utf8') 

Wenn ich console.log (Dezember), es ist null. Aus irgendeinem Grund, wenn ich den Test auf "123 | 123123" setze, funktioniert es. Warum funktioniert "123 | 123123", aber "123 | 123123123123123" nicht?

+1

Die letzte Arbeitslänge für Text scheint 15 Zeichen zu sein. – Mike

Antwort

27

Sie benötigen die Rückkehr von cipher.update zu speichern sowie cipher.final sicher zu sein, Sie alles haben.

cipher.update „gibt die chiffrierten Inhalte und können oft mit neuen Daten genannt werden, da sie gestreamt“:

http://nodejs.org/docs/v0.2.5/api.html#cipher-update-247

cipher.final „liefert alle verbleibenden chiffrierten Inhalte“.

Ich glaube, Sie nur die Ergebnisse mit jedem Aufruf wie folgt anhängen:

var crypto = require('crypto'); 
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8'); 
var text = "123|123123123123123"; 
var crypted = cipher.update(text,'utf8','hex'); 
crypted += cipher.final('hex'); 
var decipher = crypto.createDecipher('aes-256-cbc','InmbuvP6Z8'); 
var dec = decipher.update(crypted,'hex','utf8'); 
dec += decipher.final('utf8'); 

I '12443a347e8e5b46caba9f7afc93d71287fbf11169e8556c6bb9c51760d5c585' für crypted und '123 | 123123123123123' get für Dezember mit Knoten v0.2.5 in der obigen

+3

RandomEtc ist korrekt, denken Sie daran, dass in node.js alles gestrafft ist für, nun, Streams. Die Hash-und Verschlüsselungsfunktionen können mit Text beliebig oft aktualisiert werden, die nur Text hinzufügt, aber das Ergebnis zu erhalten, müssen Sie für Ihre Antwort auf diese Frage eine hash.digest oder cipher.final – Vanwaril

+0

RandomEtc dank tun. Es hat mich endlich auf Crypto-Sachen gebracht! :) –

8

RandomEtc ist richtig, aber nur falls jemand auf diese Frage Stolper verwendet 'base64' als ihre Codierung: nicht. Bleib bei 'hex'. Zumindest ab 0.4.2 gibt es einen Fehler, der zu fehlerhaften Daten führen kann, wenn 'base64' verwendet wird. Siehe: https://github.com/joyent/node/issues/738/