¿Cómo hacer la codificación Base64 en node.js?

839

¿No tiene node.js codificación base64 incorporada todavía?

La razón por la que pido es que final()a partir cryptopueden los datos sólo hexagonales de salida, ASCII o binarios. Por ejemplo:

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

Según los documentos, update()puede generar datos codificados en base64. Sin embargo, final()no es compatible con base64. Lo intenté y se romperá.

Si hago esto:

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

Entonces, ¿qué debo usar para descifrar? Hex o base64?

Por lo tanto, estoy buscando una función para codificar en base64 mi salida hexadecimal cifrada.

murvinlai
fuente
8
Para alguien que busca este problema en / después de 2016 cipher.final('base64')funciona
avck
intente base122 github.com/kevinAlbs/Base122
tim

Respuestas:

1968

Los buffers se pueden usar para tomar una cadena o una pieza de datos y realizar una codificación base64 del resultado. Por ejemplo:

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

Los buffers son un objeto global, por lo que no se necesita ningún requisito. Los buffers creados con cadenas pueden tomar un parámetro de codificación opcional para especificar en qué codificación se encuentra la cadena. Las codificaciones disponibles toStringy del Bufferconstructor son las siguientes:

'ascii': solo para datos ASCII de 7 bits. Este método de codificación es muy rápido y eliminará el bit alto si está configurado.

'utf8': caracteres Unicode codificados con varios bytes. Muchas páginas web y otros formatos de documentos usan UTF-8.

'ucs2': 2 bytes, caracteres Unicode codificados en little endian. Solo puede codificar BMP (Plano multilingüe básico, U + 0000 - U + FFFF).

'base64': codificación de cadena Base64.

'binario': una forma de codificar datos binarios sin formato en cadenas utilizando solo los primeros 8 bits de cada carácter. Este método de codificación está en desuso y debe evitarse en favor de los objetos Buffer siempre que sea posible. Esta codificación se eliminará en futuras versiones de Node.

onteria_
fuente
2
const atob = (data) => Buffer.from(data, 'base64').toString('ascii');
spencer.sm
eso debería ser .toString("binary")( atobsignifica ascii (base64) a binario, después de todo)
12Me21
@ 12Me21 ¿Pensé que representaba ascii a base64?
David Callanan
@DavidCallanan atob () convierte desde base64
12Me21
@ 12Me21 Ok, gracias por aclarar
David Callanan
221

La respuesta aceptada anteriormente contenida new Buffer() , lo que se considera un problema de seguridad en las versiones de nodo superiores a 6 (aunque parece probable para este caso de uso que la entrada siempre se pueda forzar a una cadena).

El Bufferconstructor está en desuso de acuerdo con la documentación .

Aquí hay un ejemplo de una vulnerabilidad que puede resultar de su uso en la biblioteca ws.

Los fragmentos de código deberían leer:

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

Después de escribir esta respuesta, se ha actualizado y ahora coincide con esto.

No javaneses
fuente
Cuando trato de usar su primera línea, Node devuelve: [TypeError: esto no es una matriz escrita.]
Dave Voyles
77
Este error ocurre en versiones de nodo anteriores a v6. En estas versiones necesitará usar el constructor ( new Buffer) en lugar de Buffer.from.
NotJavanese
Buffer.from () fue agregado en v4.5.0.
dskrvk
72
Solo para ahorrarle unos minutos que perdí tratando de ver la diferencia entre este ejemplo y el de la respuesta aceptada, la respuesta aceptada ahora se actualiza a lo que sugiere esta respuesta.
Kunok
39

crypto ahora es compatible con base64 ( referencia ):

cipher.final('base64') 

Entonces simplemente podrías hacer:

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');
Javier Ferrero
fuente
3
¿Alguna razón para usar esto sobre la respuesta de NotJavanese?
Trevor
3
¡Tuve que hacer coincidir los cifrados entre Node y Python y esta respuesta me salvó una pregunta! Gracias :)
GigiSan
1

Los buffers se pueden usar para tomar una cadena o una pieza de datos y realizar una codificación base64 del resultado. Por ejemplo:

Puede instalar Buffer a través de npm como: -npm i buffer --save

puedes usar esto en tu jsarchivo así:

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
Vishal Thakur
fuente
0

Estoy usando el siguiente código para decodificar la cadena base64 en la API del nodo nodejs versión 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 + '"'); 

No intente ejecutar el código anterior en la consola del navegador, no funcionará. Ponga el código en los archivos del lado del servidor de nodejs. Estoy usando el código de línea anterior en el desarrollo de API.

Devendra Chhaiya
fuente
0

He creado una pequeña biblioteca js npm para la conversión de codificación / decodificación base64 en Node.js.

Instalación

npm install nodejs-base64-converter --save

Uso

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

console.log(nodeBase64.encode("test text")); //dGVzdCB0ZXh0
console.log(nodeBase64.decode("dGVzdCB0ZXh0")); //test text
Prajapati Manish
fuente
0

Puede hacer la codificación y decodificación base64 con javascript simple.

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

Esto se implementa en este decodificador de codificador Base64

Ishaan Sharma
fuente