Jak zrobić kodowanie Base64 w węźle.js?

Robi węzeł.js ma już wbudowane kodowanie base64?

Powodem, dla którego pytam, jest to, że final() z crypto mogą wysyłać tylko dane szesnastkowe, 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 wysyłać dane zakodowane w base64. Jednak final() nie obsługuje base64. Próbowałem i się złamie.

Jeśli to zrobię:

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

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

Dlatego szukam funkcji do base64 - encode my encoded wyjście sześciokątne.

Dzięki.
Author: Giulio Muscarello, 2011-05-31

3 answers

Bufory mogą być używane do pobierania ciągu lub fragmentu danych i wykonywania kodowania wyniku base64. Na przykład:

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

Bufory są obiektami globalnymi, więc nie są potrzebne żadne wymagania. Bufory utworzone za pomocą łańcuchów mogą przyjmować opcjonalny parametr kodowania, aby określić kodowanie łańcucha. Dostępne kodowania konstruktorów toString i Buffer są następujące:

'ascii' - tylko dla 7 bitowych danych ASCII. Ta metoda kodowania jest bardzo szybko i pozbędzie się wysokiej bit jeśli ustawiony.

'utf8' - kodowanie wielu bajtów Znaki Unicode. Wiele stron internetowych i innych formatów dokumentów używa UTF-8.

'ucs2' - 2-bajtowe, małe endian zakodowane znaki Unicode. Informatyka może kodować tylko BMP (Podstawowa płaszczyzna Wielojęzyczna, U+0000 - u+FFFF).

'base64' - kodowanie ciągu Base64.

'binary' - sposób kodowania raw dane binarne do ciągów za pomocą tylko pierwszych 8 bitów każdego charakter. Ta metoda kodowania jest przestarzała i powinna unikać w faworyzowanie obiektów bufora w miarę możliwości. To kodowanie zostanie usunięte w przyszłych wersjach Node.

 1525
Author: onteria_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 20:42:12

Zaakceptowana odpowiedź Zawiera to, co jest uważane za problem bezpieczeństwa w wersjach węzłów większych niż 6 (chociaż wydaje się prawdopodobne, że w tej sytuacji Wejście Może być zawsze wymuszone na łańcuchu znaków).

Konstruktor Buffer jest przestarzały zgodnie z dokumentacją .

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

Urywki kodu powinny brzmieć:

console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));
 153
Author: NotJavanese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 19:34:38

Crypto obsługuje teraz Base64 (reference):

cipher.final('base64') 

Więc można 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');
 29
Author: Javier Ferrero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-03 08:59:38