¿Cómo puedo codificar Base64 en Node.js?
¿Node.js ya tiene codificación Base64 incorporada?
La razón por la que pregunto esto es que final()
from crypto
solo puede generar datos hexadecimales, binarios o ASCII. 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 la documentación, 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? ¿Hexadecimal o Base64?
Por lo tanto, estoy buscando una función para codificar en Base64 mi salida hexadecimal cifrada.
Los buffers se pueden usar para tomar una cadena o un dato y realizar la 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
El Buffer
constructor es 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 toString
y Buffer
de constructor 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 de varios bytes. Muchas páginas web y otros formatos de documentos utilizan UTF-8.
'ucs2': caracteres Unicode codificados en little endian de 2 bytes. 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 procesar 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.
La respuesta aceptada anteriormente contenía new Buffer()
, lo que se considera un problema de seguridad en las versiones de Node.js superiores a 6 (aunque parece probable que para este caso de uso la entrada siempre se pueda convertir en una cadena).
El Buffer
constructor está en desuso según la documentación .
Los fragmentos de código deberían decir:
console.log(Buffer.from("Hello World").toString('base64'));
console.log(Buffer.from("SGVsbG8gV29ybGQ=", 'base64').toString('ascii'));
Después de escribir esta respuesta, se actualizó y ahora coincide con esto.
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');
Los buffers se pueden usar para tomar una cadena o un dato y realizar la codificación Base64 del resultado. Por ejemplo:
Puedes instalar Buffer a través de npm como:npm i buffer --save
Puedes usar esto en tu js
archivo de esta manera:
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