Wie wird die Base64-Codierung in node.js durchgeführt?


839

Hat node.js bereits eine integrierte base64-Codierung?

Der Grund, warum ich dies frage, ist, dass final()von cryptonur Hex-, Binär- oder ASCII-Daten ausgeben kann. Zum Beispiel:

var cipher = crypto.createCipheriv('des-ede3-cbc', encryption_key, iv);
var ciph = cipher.update(plaintext, 'utf8', 'hex');
ciph += cipher.final('hex');

var decipher = crypto.createDecipheriv('des-ede3-cbc', encryption_key, iv);
var txt = decipher.update(ciph, 'hex', 'utf8');
txt += decipher.final('utf8');

update()Kann laut Dokumentation base64-codierte Daten ausgeben. Allerdings final()unterstützt nicht base64. Ich habe es versucht und es wird brechen.

Wenn ich das mache:

var ciph = cipher.update(plaintext, 'utf8', 'base64');
    ciph += cipher.final('hex');

Was soll ich dann zur Entschlüsselung verwenden? Hex oder Base64?

Daher suche ich nach einer Funktion zum Base64-Codieren meiner verschlüsselten Hex-Ausgabe.


8
Für jemanden für dieses Problem in / nach 2016 sucht cipher.final('base64')Werke
avck

versuchen Sie base122 github.com/kevinAlbs/Base122
tim

Antworten:


1967

Puffer können verwendet werden, um eine Zeichenfolge oder ein Datenelement aufzunehmen und das Ergebnis mit base64 zu codieren. Zum Beispiel:

> console.log(Buffer.from("Hello World").toString('base64'));
SGVsbG8gV29ybGQ=
> console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'))
Hello World

Puffer sind ein globales Objekt, daher ist keine Anforderung erforderlich. Mit Zeichenfolgen erstellte Puffer können einen optionalen Codierungsparameter verwenden, um anzugeben, in welcher Codierung sich die Zeichenfolge befindet. Die verfügbaren toStringund BufferKonstruktorcodierungen lauten wie folgt:

'ascii' - nur für 7-Bit-ASCII-Daten. Diese Codierungsmethode ist sehr schnell und entfernt das High-Bit, wenn es gesetzt ist.

'utf8' - Mehrbyte-codierte Unicode-Zeichen. Viele Webseiten und andere Dokumentformate verwenden UTF-8.

'ucs2' - 2 Bytes, Little Endian-codierte Unicode-Zeichen. Es kann nur BMP (Basic Multilingual Plane, U + 0000 - U + FFFF) codieren.

'base64' - Base64-Zeichenfolgencodierung.

'binary' - Eine Möglichkeit, binäre Rohdaten in Zeichenfolgen zu codieren, indem nur die ersten 8 Bits jedes Zeichens verwendet werden. Diese Codierungsmethode ist veraltet und sollte nach Möglichkeit zugunsten von Pufferobjekten vermieden werden. Diese Codierung wird in zukünftigen Versionen von Node entfernt.


2
const atob = (data) => Buffer.from(data, 'base64').toString('ascii');
spencer.sm

das sollte sein .toString("binary")( atobsteht schließlich für ascii (base64) bis binär)
12Me21

@ 12Me21 Ich dachte, es steht für ASCII zu Base64?
David Callanan

@DavidCallanan atob () konvertiert von base64
12Me21

@ 12Me21 Ok, danke für die Klarstellung
David Callanan

221

Die zuvor enthaltene akzeptierte Antwort new Buffer(), die in Knotenversionen größer als 6 als Sicherheitsproblem angesehen wird (obwohl es für diesen Anwendungsfall wahrscheinlich ist, dass die Eingabe immer zu einer Zeichenfolge gezwungen werden kann).

Der BufferKonstruktor ist gemäß der Dokumentation veraltet .

Hier ist ein Beispiel für eine Sicherheitsanfälligkeit , die sich aus der Verwendung in der ws-Bibliothek ergeben kann.

Die Codefragmente sollten lauten:

console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));

Nachdem diese Antwort geschrieben wurde, wurde sie aktualisiert und stimmt nun mit dieser überein.


Wenn ich versuche, Ihre erste Zeile zu verwenden, gibt Node Folgendes zurück: [TypeError: Dies ist kein typisiertes Array.]
Dave Voyles

7
Dieser Fehler tritt bei Knotenversionen auf, die älter als Version 6 sind. In diesen Versionen müssen Sie den Konstruktor ( new Buffer) anstelle von verwenden Buffer.from.
NotJavanese

Buffer.from () wurde in Version 4.5.0 hinzugefügt.
dskrvk

71
Um Ihnen einige Minuten zu ersparen, die ich beim Versuch verloren habe, den Unterschied zwischen diesem Beispiel und dem in der akzeptierten Antwort zu erkennen, wird die akzeptierte Antwort jetzt auf das aktualisiert, was diese Antwort vorschlägt.
Kunok

39

Krypto unterstützt jetzt base64 ( Referenz ):

cipher.final('base64') 

Sie können also einfach Folgendes tun:

var cipher = crypto.createCipheriv('des-ede3-cbc', encryption_key, iv);
var ciph = cipher.update(plaintext, 'utf8', 'base64');
ciph += cipher.final('base64');

var decipher = crypto.createDecipheriv('des-ede3-cbc', encryption_key, iv);
var txt = decipher.update(ciph, 'base64', 'utf8');
txt += decipher.final('utf8');

3
Gibt es einen Grund, dies gegenüber der Antwort von NotJavanese zu verwenden?
Trevor

3
Musste Verschlüsselungen zwischen Node und Python abgleichen und diese Antwort ersparte mir eine Frage! Danke :)
GigiSan

1

Puffer können verwendet werden, um eine Zeichenfolge oder ein Datenelement aufzunehmen und das Ergebnis mit base64 zu codieren. Zum Beispiel:

Sie können Buffer über npm installieren wie: -npm i buffer --save

Sie können dies in Ihrer jsDatei wie folgt verwenden: -

var buffer = require('buffer/').Buffer;

->> console.log(buffer.from("Hello Vishal Thakur").toString('base64'));
SGVsbG8gVmlzaGFsIFRoYWt1cg==  // Result

->> console.log(buffer.from("SGVsbG8gVmlzaGFsIFRoYWt1cg==", 'base64').toString('ascii'))
Hello Vishal Thakur   // Result

0

Ich verwende den folgenden Code, um die base64-Zeichenfolge in der Node-API nodejs Version 10.7.0 zu dekodieren

let data = 'c3RhY2thYnVzZS5jb20=';  // Base64 string
let buff = new Buffer(data, 'base64');  //Buffer
let text = buff.toString('ascii');  //this is the data type that you want your Base64 data to convert to
console.log('"' + data + '" converted from Base64 to ASCII is "' + text + '"'); 

Bitte versuchen Sie nicht, den obigen Code in der Konsole des Browsers auszuführen. Dies funktioniert nicht. Fügen Sie den Code in serverseitige Dateien von nodejs ein. Ich verwende den obigen Zeilencode in der API-Entwicklung.


0

Ich habe eine ultimative kleine js npm- Bibliothek für die Base64-Codierungs- / Decodierungskonvertierung in Node.js erstellt.

Installation

npm install nodejs-base64-converter --save

Verwendungszweck

var nodeBase64 = require('nodejs-base64-converter');

console.log(nodeBase64.encode("test text")); //dGVzdCB0ZXh0
console.log(nodeBase64.decode("dGVzdCB0ZXh0")); //test text

0

Sie können Base64 mit einfachem Javascript codieren und decodieren.

    $("input").keyup(function () {
     var value = $(this).val(),
         hash = Base64.encode(value);
     $(".test").html(hash);

     var decode = Base64.decode(hash);

     $(".decode").html(decode);
 });

var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = Base64.encode(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = Base64.decode(encodedString);
console.log(decodedString); // Outputs: "Hello World!"</script></div>

Dies ist in diesem Base64-Encoder-Decoder implementiert

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.