Bagaimana cara melakukan encoding Base64 di node.js?


839

Apakah node.js memiliki pengkodean base64 bawaan?

Alasan mengapa saya menanyakan hal ini adalah bahwa final()dari cryptohanya dapat menampilkan data hex, binary atau ascii. Sebagai contoh:

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

Menurut dokumen, update()dapat menampilkan data yang disandikan base64. Namun, final()tidak mendukung base64. Saya mencoba dan itu akan pecah.

Jika saya melakukan ini:

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

Lalu apa yang harus saya gunakan untuk dekripsi? Hex atau base64?

Oleh karena itu, saya mencari fungsi untuk meng-encode output hex terenkripsi base64 saya.


8
Untuk seseorang yang mencari masalah ini di / setelah 2016 cipher.final('base64')bekerja
avck

Jawaban:


1968

Buffer dapat digunakan untuk mengambil string atau sepotong data dan melakukan pengkodean base64 dari hasilnya. Sebagai contoh:

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

Buffer adalah objek global, jadi tidak perlu diperlukan. Buffer yang dibuat dengan string dapat mengambil parameter enkode opsional untuk menentukan apa enkode string. Enkode yang tersedia toStringdan Bufferkonstruktor adalah sebagai berikut:

'ascii' - hanya untuk data ASCII 7 bit. Metode pengkodean ini sangat cepat, dan akan menghapus bit yang tinggi jika diatur.

'utf8' - karakter Unicode yang disandikan multi byte. Banyak halaman web dan format dokumen lainnya menggunakan UTF-8.

'ucs2' - 2-byte, karakter Unicode kecil endian yang dikodekan. Ia hanya dapat menyandikan BMP (Basic Multilingual Plane, U + 0000 - U + FFFF).

'base64' - pengkodean string Base64.

'binary' - Suatu cara pengkodean data biner mentah ke dalam string dengan hanya menggunakan 8 bit pertama dari setiap karakter. Metode pengkodean ini sudah usang dan harus dihindari dalam mendukung objek Buffer jika memungkinkan. Pengkodean ini akan dihapus di versi Node mendatang.


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

itu seharusnya .toString("binary")( atobsingkatan dari ascii (base64) untuk biner, setelah semua)
12Me21

@ 12Me21 Saya pikir itu singkatan ascii to base64?
David Callanan

@DavidCallanan atob () mengkonversi dari base64
12Me21

@ 12Me21 Oke terima kasih telah menjelaskan
David Callanan

221

Jawaban yang diterima sebelumnya berisi new Buffer() , yang dianggap sebagai masalah keamanan dalam versi node lebih besar dari 6 (meskipun tampaknya untuk usecase ini bahwa input selalu dapat dipaksa ke string).

The Bufferkonstruktor sudah ditinggalkan sesuai dengan dokumentasi .

Berikut adalah contoh kerentanan yang dapat dihasilkan dari menggunakannya di pustaka ws.

Cuplikan kode harus berbunyi:

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

Setelah jawaban ini ditulis, itu telah diperbarui dan sekarang cocok dengan ini.


Ketika saya mencoba menggunakan baris pertama Anda, Node kembali: [TypeError: ini bukan array yang diketik.]
Dave Voyles

7
Kesalahan ini terjadi pada versi node yang lebih tua dari v6. Dalam versi ini, Anda harus menggunakan constructor ( new Buffer) daripada Buffer.from.
NotJavanese

Buffer.from () ditambahkan dalam v4.5.0.
dskrvk

72
Hanya untuk menghemat beberapa menit ketika saya kehilangan usaha untuk melihat perbedaan antara contoh ini dan yang ada di jawaban yang diterima, jawaban yang diterima sekarang diperbarui dengan apa yang disarankan oleh jawaban ini.
Kunok

39

crypto sekarang mendukung base64 ( referensi ):

cipher.final('base64') 

Jadi Anda bisa melakukannya:

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
Ada alasan untuk menggunakan ini di atas jawaban NotJavanese?
Trevor

3
Harus mencocokkan enkripsi antara Node dan Python dan jawaban ini menyelamatkan saya pertanyaan! Terima kasih :)
GigiSan

1

Buffer dapat digunakan untuk mengambil string atau sepotong data dan melakukan pengkodean base64 dari hasilnya. Sebagai contoh:

Anda dapat menginstal Buffer melalui npm seperti: -npm i buffer --save

Anda dapat menggunakan ini di jsfile Anda seperti ini: -

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

Saya menggunakan kode berikut untuk mendekode string base64 di node API nodejs versi 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 + '"'); 

Tolong jangan mencoba untuk menjalankan kode di atas di konsol browser, tidak akan berfungsi. Masukkan kode dalam file sisi server dari nodejs. Saya menggunakan kode baris di atas dalam pengembangan API.


0

Saya telah membuat js npm kecil utama pustaka untuk konversi encode / decode base64 di Node.js.

Instalasi

npm install nodejs-base64-converter --save

Pemakaian

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

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

0

Anda dapat melakukan encoding dan decoding base64 dengan javascript sederhana.

    $("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>

Ini diimplementasikan dalam decoder encoder Base64 ini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.