Comment faire l'encodage Base64 dans node.js?


839

Node.js a-t-il déjà un encodage base64 intégré?

La raison pour laquelle je pose cette question est que final()from cryptone peut sortir que des données hexadécimales, binaires ou ascii. Par exemple:

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

Selon les documents, update()peut produire des données encodées en base64. Cependant, final()ne prend pas en charge base64. J'ai essayé et ça va casser.

Si je fais ça:

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

Alors, que dois-je utiliser pour le déchiffrement? Hex ou base64?

Par conséquent, je recherche une fonction pour coder en base64 ma sortie hexadécimale cryptée.


8
Pour quelqu'un qui recherche ce problème dans / après les cipher.final('base64')travaux de 2016
avck

Réponses:


1968

Tampons peuvent être utilisés pour prendre une chaîne ou un morceau de données et effectuer un codage base64 du résultat. Par exemple:

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

Les tampons sont un objet global, donc aucune exigence n'est nécessaire. Les tampons créés avec des chaînes peuvent prendre un paramètre de codage facultatif pour spécifier le codage de la chaîne.toStringBuffer codages et constructeurs sont les suivants:

'ascii' - pour les données ASCII 7 bits uniquement. Cette méthode d'encodage est très rapide et supprimera le bit haut s'il est défini.

'utf8' - Caractères Unicode codés sur plusieurs octets. De nombreuses pages Web et autres formats de documents utilisent UTF-8.

'ucs2' - 2 octets, petits caractères Unicode encodés en endian. Il ne peut coder que BMP (plan multilingue de base, U + 0000 - U + FFFF).

'base64' - Encodage de chaîne Base64.

«binaire» - Un moyen de coder des données binaires brutes en chaînes en utilisant uniquement les 8 premiers bits de chaque caractère. Cette méthode de codage est obsolète et doit être évitée en faveur des objets Buffer lorsque cela est possible. Cet encodage sera supprimé dans les futures versions de Node.


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

cela devrait être .toString("binary")( atobsignifie ascii (base64) en binaire, après tout)
12Me21

@ 12Me21 Je pensais que cela représentait ascii en base64?
David Callanan

@DavidCallanan atob () convertit à partir de base64
12Me21

@ 12Me21 Ok merci pour la clarification
David Callanan

221

La réponse acceptée contenait précédemment new Buffer() , ce qui est considéré comme un problème de sécurité dans les versions de nœuds supérieures à 6 (bien qu'il semble probable pour cette utilisation que l'entrée puisse toujours être contrainte à une chaîne).

Le Bufferconstructeur est obsolète selon la documentation .

Voici un exemple de vulnérabilité pouvant résulter de son utilisation dans la bibliothèque ws.

Les extraits de code doivent indiquer:

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

Après que cette réponse a été écrite, elle a été mise à jour et correspond maintenant à cela.


Lorsque j'essaie d'utiliser votre première ligne, Node renvoie: [TypeError: ce n'est pas un tableau typé.]
Dave Voyles

7
Cette erreur se produit sur les versions de nœuds antérieures à la v6. Dans ces versions, vous devrez utiliser le constructeur ( new Buffer) plutôt que Buffer.from.
NotJavanese

Buffer.from () a été ajouté dans la v4.5.0.
dskrvk

72
Juste pour vous épargner quelques minutes que j'ai perdu en essayant de voir la différence entre cet exemple et celui de la réponse acceptée, la réponse acceptée est maintenant mise à jour en fonction de ce que cette réponse suggère.
Kunok

39

crypto prend désormais en charge base64 ( référence ):

cipher.final('base64') 

Vous pouvez donc simplement faire:

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
Y a-t-il une raison d'utiliser cela sur la réponse de NotJavanese?
Trevor

3
J'ai dû faire correspondre les cryptages entre Node et Python et cette réponse m'a sauvé une question! Merci :)
GigiSan

1

Les tampons peuvent être utilisés pour prendre une chaîne ou un morceau de données et effectuer un codage base64 du résultat. Par exemple:

Vous pouvez installer Buffer via npm comme: -npm i buffer --save

vous pouvez utiliser ceci dans votre jsfichier comme ceci: -

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

J'utilise le code suivant pour décoder la chaîne base64 dans l'API de nœud nodejs version 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 + '"'); 

N'essayez pas d'exécuter le code ci-dessus dans la console du navigateur, cela ne fonctionnera pas. Mettez le code dans les fichiers côté serveur de nodejs. J'utilise le code de ligne ci-dessus dans le développement d'API.


0

J'ai créé une petite bibliothèque js npm ultime pour la conversion d'encodage / décodage base64 dans Node.js.

Installation

npm install nodejs-base64-converter --save

Usage

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

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

0

Vous pouvez effectuer l'encodage et le décodage base64 avec un simple javascript.

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

Ceci est implémenté dans ce décodeur d'encodeur Base64

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.