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


¿Tiene node.js incorporado la codificación base64 todavía?

La razón por la que pregunto esto es que final() de crypto solo puede dar salida a 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');

De acuerdo con los documentos, update() puede dar salida a 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 base64 mi salida hex cifrada.

Gracias.


590
2018-05-31 02:09


origen


Respuestas:


Buffers se puede usar para tomar una cadena o un fragmento de datos y hacer 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 búferes son un objeto global, por lo que no es necesario. Los búferes creados con cadenas pueden tomar un parámetro de codificación opcional para especificar en qué codificación está la cadena. El disponible toString y Buffer las codificaciones del constructor son las siguientes:

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

'utf8' - Codificado en varios bytes   Caracteres Unicode Muchas páginas web y otros formatos de documentos usan   UTF-8.

'ucs2' - 2 bytes, pequeños caracteres endian codificados en Unicode. Eso   solo puede codificar BMP (plano multilingüe básico, U + 0000 - U + FFFF).

'base64' - Codificación de cadena Base64.

'binario': una forma de codificar sin procesar   datos binarios en cadenas usando solo los primeros 8 bits de cada   personaje. Este método de codificación está en desuso y debe evitarse en   favor de los objetos Buffer donde sea posible. Esta codificación será eliminada   en versiones futuras de Node.


1458
2018-05-31 02:46



La respuesta aceptada contiene lo que se considera un problema de seguridad en versiones de nodos superiores a 6 (aunque parece probable en este caso de uso que la entrada siempre se pueda forzar a una cadena).

los Buffer constructor está en desuso según el documentación.

aquí es un ejemplo de vulnerabilidad que puede resultar de su uso en la biblioteca ws.

Los fragmentos de código deben leer:

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

145
2017-07-07 04:37



crypto ahora es compatible con base64 (referencia)

cipher.final('base64') 

Entonces podrías simplemente 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');

27
2018-04-24 20:17