Jak wykonać kodowanie Base64 w node.js?


839

Czy node.js ma już wbudowane kodowanie base64?

Powodem dlaczego pytam jest to, że final()z cryptodanych CAN tylko wyjście hex, binarne lub ASCII. Na przykład:

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');

Zgodnie z dokumentami, update()może wyprowadzać dane zakodowane w base64. Jednak final()nie obsługuje base64. Próbowałem i to się zepsuje.

Jeśli to zrobię:

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

Więc czego powinienem użyć do odszyfrowania? Hex czy base64?

Dlatego szukam funkcji do kodowania base64 mojego zaszyfrowanego wyjścia szesnastkowego.


8
Dla kogoś, kto szuka tego problemu w / po 2016 cipher.final('base64')działa
avck

spróbuj base122 github.com/kevinAlbs/Base122
tim

Odpowiedzi:


1964

Buforów można użyć do pobrania ciągu danych lub fragmentu danych i wykonania kodowania base64 wyniku. Na przykład:

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

Bufory są obiektem globalnym, więc nie jest wymagane żadne wymaganie. Bufory utworzone za pomocą strun może opcjonalny parametr kodowania, aby określić co kodującego łańcuch jest w dostępnym. toStringI Bufferkonstruktor kodowania są następujące:

„ascii” - tylko dla 7 bitowych danych ASCII. Ta metoda kodowania jest bardzo szybka i jeśli zostanie ustawiona, usunie wysoki bit.

„utf8” - Wielobajtowe znaki Unicode. Wiele stron internetowych i innych formatów dokumentów korzysta z UTF-8.

„ucs2” - 2 bajty, małe znaki Unicode zakodowane w systemie Endian. Może kodować tylko BMP (Basic Multilingual Plane, U + 0000 - U + FFFF).

„base64” - kodowanie ciągu Base64.

„binary” - Sposób kodowania surowych danych binarnych w ciągi znaków przy użyciu tylko pierwszych 8 bitów każdego znaku. Ta metoda kodowania jest przestarzała i należy jej unikać, jeśli to możliwe, na rzecz obiektów buforujących. To kodowanie zostanie usunięte w przyszłych wersjach Node.


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

tak powinno być .toString("binary")(w atobkońcu oznacza ascii (base64) na binarny)
12Me21

@ 12Me21 Myślałem, że to oznacza ascii do base64?
David Callanan

@DavidCallanan atob () konwertuje z base64
12Me21

@ 12Me21 Ok, dziękuję za wyjaśnienie
David Callanan

221

Akceptowana odpowiedź poprzednio zawierała new Buffer() , co jest uważane za problem bezpieczeństwa w wersjach węzłów większych niż 6 (choć wydaje się prawdopodobne, że dla tego przypadku użycia dane wejściowe zawsze można przekonwertować na ciąg znaków).

BufferKonstruktor jest przestarzała zgodnie z dokumentacją .

Oto przykład luki, która może wynikać z użycia jej w bibliotece ws.

Fragmenty kodu powinny brzmieć:

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

Po napisaniu tej odpowiedzi została zaktualizowana i teraz pasuje do tego.


Kiedy próbuję użyć pierwszego wiersza, Węzeł zwraca: [Błąd typu: nie jest to tablica maszynowa.]
Dave Voyles

7
Ten błąd występuje w wersjach węzłów starszych niż v6. W tych wersjach będziesz musiał użyć konstruktora ( new Buffer) zamiast Buffer.from.
NotJavanese

Buffer.from () został dodany w wersji 4.5.0.
dskrvk

71
Aby zaoszczędzić kilka minut, które straciłem, próbując zobaczyć różnicę między tym przykładem a tym w zaakceptowanej odpowiedzi, zaakceptowana odpowiedź jest teraz aktualizowana zgodnie z sugestią tej odpowiedzi.
Kunok

39

crypto obsługuje teraz base64 ( referencje ):

cipher.final('base64') 

Więc możesz po prostu zrobić:

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
Czy jest jakiś powód, aby użyć tego zamiast odpowiedzi NotJavanese?
Trevor

3
Musiałem dopasować szyfrowanie między Węzłem a Pythonem, a ta odpowiedź uratowała mi pytanie! Dzięki :)
GigiSan

1

Bufory można użyć do pobrania ciągu danych lub fragmentu danych i wykonania kodowania base64 wyniku. Na przykład:

Możesz zainstalować bufor za pomocą npm:npm i buffer --save

możesz użyć tego w swoim jspliku w następujący sposób: -

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

Używam następującego kodu do dekodowania ciągu base64 w węźle API nodejs w wersji 10.7.0

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 + '"'); 

Nie próbuj uruchamiać powyżej kodu w konsoli przeglądarki, nie będzie działać. Umieść kod w plikach po stronie serwera nodejs. Używam powyższego kodu linii do programowania API.


0

Stworzyłem ostateczne małe js npm bibliotekę dla konwersji kodowania / dekodowania base64 w Node.js.

Instalacja

npm install nodejs-base64-converter --save

Stosowanie

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

console.log(nodeBase64.encode("test text")); //dGVzdCB0ZXh0
console.log(nodeBase64.decode("dGVzdCB0ZXh0")); //test text
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.