Як зробити кодування Base64 в node.js?


839

Чи node.js ще має вбудовану базування6464?

Причина, чому я прошу це, полягає в тому, що final()з них cryptoможна виводити тільки шістнадцяткові, двійкові чи дані ascii. Наприклад:

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()може виводити базові64-кодовані дані. Однак final()не підтримує base64. Я спробував, і воно зламається.

Якщо я це роблю:

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

Тоді що я повинен використовувати для дешифрування? Hex або base64?

Тому я шукаю функцію для базового64-кодування мого зашифрованого шістнадцяткового виводу.


8
Для кого - то шукає цю проблему в / після 2016 року cipher.final('base64')робіт
avck

спробуйте base122 github.com/kevinAlbs/Base122
час

Відповіді:


1964

Буфери можуть бути використані для взяття рядка або фрагмента даних та для кодування результату base64. Наприклад:

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

Буфери - це глобальний об'єкт, тому не потрібно нічого. Буфери , створені з допомогою рядків може приймати необов'язковий параметр кодування , щоб вказати , що кодує послідовність знаходиться в доступних. toStringІ Bufferконструктор кодіроакі наступним чином :

"ascii" - лише для 7-бітових даних ASCII. Цей метод кодування дуже швидкий, і він зніме високий біт, якщо його встановлено.

'utf8' - багатобайтові символи Unicode. Багато веб-сторінок та інших форматів документів використовують UTF-8.

'ucs2' - 2-байтні маленькі символи Unicode, закодовані ендіаном. Він може кодувати лише BMP (Основна багатомовна площина, U + 0000 - U + FFFF).

'base64' - рядкове кодування Base64.

'binary' - спосіб кодування необроблених бінарних даних у рядки, використовуючи лише перші 8 біт кожного символу. Цей метод кодування застарілий і його слід уникати на користь буферних об'єктів, де це можливо. Це кодування буде видалено в майбутніх версіях Node.


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

це повинно бути .toString("binary")( atobозначає, що ascii (base64) для двійкового, зрештою)
12Me21

@ 12Me21 Я думав, що це означає асьці до base64?
Девід Калланан

@DavidCallanan atob () перетворюється з base64
12Me21

@ 12Me21 Добре дякую за уточнення
Девід Калланан

221

Раніше містилася прийнята відповідь new Buffer(), яка вважається проблемою безпеки у версіях вузлів, що перевищують 6 (хоча для цього випадку використання ймовірно, що введення завжди можна примусити до рядка).

BufferКонструктор засуджується в відповідно до документацією .

Ось приклад вразливості, яка може бути наслідком використання її в бібліотеці ws.

У фрагментах коду має бути зазначено:

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

Після написання цієї відповіді вона була оновлена ​​і тепер відповідає цій.


Коли я намагаюся використати ваш перший рядок, Node повертається: [TypeError: це не набраний масив.]
Дейв Войлес

7
Ця помилка трапляється у версії вузлів, старших за v6. У цих версіях вам потрібно використовувати конструктор ( new Buffer), а не Buffer.from.
NotJavanese

Buffer.from () додавали в v4.5.0.
dskrvk

71
Тільки для того, щоб заощадити кілька хвилин, які я втратив, намагаючись побачити різницю між цим прикладом та відповідним у прийнятій відповіді, прийнята відповідь тепер оновляється до того, що пропонує ця відповідь.
Кунок

39

тепер криптова підтримка base64 ( посилання ):

cipher.final('base64') 

Тож ви могли просто зробити:

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
Будь-яка причина використовувати це над відповіддю NotJavanese?
Тревор

3
Довелося відповідати шифрам між Node та Python, і ця відповідь врятувала мені питання! Дякую :)
GigiSan

1

Буфери можуть бути використані для взяття рядка або фрагмента даних та для кодування результату base64. Наприклад:

Ви можете встановити буфер через npm, наприклад: -npm i buffer --save

Ви можете використовувати це у своєму jsфайлі так: -

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

Я використовую наступний код для декодування рядка base64 в вузлі API nodejs версії 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 + '"'); 

Будь ласка, не намагайтеся запустити вище коду в консолі браузера, не вийде. Помістіть код у бічні файли сервера nodejs. Я використовую вище код рядка в розробці API.


0

Я створив кінцеву невелику бібліотеку js npm для перетворення базового кодування / декодування base64 в Node.js.

Установка

npm install nodejs-base64-converter --save

Використання

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

console.log(nodeBase64.encode("test text")); //dGVzdCB0ZXh0
console.log(nodeBase64.decode("dGVzdCB0ZXh0")); //test text
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.