Node.js'de Base64 kodlaması nasıl yapılır?


839

Node.js henüz yerleşik base64 kodlamasına sahip değil mi?

Bunu sormak nedeni olduğuna final()gelen cryptocan sadece çıkış altıgen, ikili veya ASCII veri. Örneğin:

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

Dokümanlara göre, update()base64 kodlu veri çıktısı verebilir. Ancak final()base64'ü desteklemez. Denedim ve kırılacak.

Bunu yaparsam:

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

O zaman şifre çözme için ne kullanmalıyım? Hex veya base64?

Bu nedenle, şifreli onaltılık çıktı base64-kodlamak için bir işlev arıyorum.


8
2016 sonrası / içinde bu soruna arayan birisi için cipher.final('base64')işler
avck

Yanıtlar:


1966

Tamponlar , bir dize veya veri parçası almak ve sonucun base64 kodlamasını yapmak için kullanılabilir. Örneğin:

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

Tamponlar global bir nesnedir, bu nedenle herhangi bir şarta gerek yoktur. Dizelerle oluşturulan arabellekler, dizenin hangi kodlamada olduğunu belirtmek için isteğe bağlı bir kodlama parametresi alabilir. Kullanılabilir toStringve Bufferyapıcı kodlamaları aşağıdaki gibidir:

'ascii' - sadece 7 bit ASCII verileri için. Bu kodlama yöntemi çok hızlıdır ve ayarlandığında yüksek biti keser.

'utf8' - Çok baytlı kodlanmış Unicode karakterler. Birçok web sayfası ve diğer belge biçimleri UTF-8 kullanır.

'ucs2' - 2 bayt, küçük endian kodlu Unicode karakterler. Sadece BMP'yi (Temel Çok Dilli Düzlem, U + 0000 - U + FFFF) kodlayabilir.

'base64' - Base64 dize kodlaması.

'binary' - Her bir karakterin yalnızca ilk 8 bitini kullanarak ham ikili verileri dizelere kodlamanın bir yolu. Bu kodlama yöntemi kullanımdan kaldırılmıştır ve mümkün olduğunda Buffer nesneleri lehine kullanılmamalıdır. Bu kodlama Düğümün gelecekteki sürümlerinde kaldırılacaktır.


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

her şeyden önce .toString("binary")( atobascii (base64) ikili anlamına gelir)
12Me21

@ 12Me21 Ascii'nin base64 için durduğunu düşündüm?
David Callanan

@DavidCallanan atob (), base64
12Me21

@ 12Me21 Tamam açıkladığın için teşekkürler
David Callanan

221

Kabul cevap daha önce bulunan new Buffer() (o girdi her zaman bir dizeye zorla edilebileceğini bu USECASE muhtemel görünüyor olsa da) düğüm sürümleri 6'dan yüksek bir güvenlik sorunu olarak kabul edilir.

BufferYapıcısına göre kaldırıldı belgeleri .

İşte ws kitaplığında kullanılmasından kaynaklanabilecek bir güvenlik açığı örneği .

Kod parçacıkları aşağıdakileri okumalıdır:

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

Bu cevap yazıldıktan sonra, güncellendi ve şimdi bununla eşleşiyor.


İlk satırınızı kullanmaya çalıştığımda, Düğüm döndürür: [TypeError: bu yazılan bir dizi değil.]
Dave Voyles

7
Bu hata, v6'dan eski düğüm sürümlerinde oluşur. Bu sürümlerde bunun new Bufferyerine yapıcı ( ) kullanmanız gerekir Buffer.from.
NotJavanese


71
Bu örnek ile kabul edilen cevaptaki farkı görmeye çalışırken kaybettiğim birkaç dakikayı kurtarmak için, kabul edilen cevap şimdi bu cevabın önerisine göre güncellenmiştir.
Kunok

39

kripto artık base64'ü ( referans ) destekliyor :

cipher.final('base64') 

Böylece şunları yapabilirsiniz:

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'nin cevabı üzerinde kullanmak için herhangi bir neden var mı?
Trevor

3
Düğüm ve Python arasındaki şifrelemeleri eşleştirmek zorunda kaldım ve bu cevap bana bir soru kaydetti! Teşekkürler :)
GigiSan

1

Tamponlar , bir dize veya veri parçası almak ve sonucun base64 kodlamasını yapmak için kullanılabilir. Örneğin:

Sen yükleyebilir Tampon gibi NPM yoluyla: -npm i buffer --save

bunu jsdosyanızda şu şekilde kullanabilirsiniz : -

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

Düğüm API düğümü sürüm 10.7.0 base64 dize kodunu çözmek için aşağıdaki kodu kullanıyorum

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

Lütfen tarayıcının konsolunda yukarıdaki kodu çalıştırmayı denemeyin, çalışmaz. Kodu nodejs sunucu tarafı dosyalarına yerleştirin. API geliştirmede yukarıdaki satır kodu kullanıyorum.


0

Node.js'de base64 kodlama / kod çözme dönüşümü için mükemmel bir küçük js npm kütüphanesi oluşturdum.

Kurulum

npm install nodejs-base64-converter --save

kullanım

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

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

0

Basit javascript ile base64 kodlama ve kod çözme yapabilirsiniz.

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

Bu, bu Base64 kodlayıcı kod çözücüde uygulanır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.