web-dev-qa-db-fra.com

Comment faire l'encodage Base64 dans node.js?

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

La raison pour laquelle je pose cette question est que final() de crypto ne peut émettre 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 la documentation, update() peut générer des données codé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écryptage? Hex ou base64?

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

Merci.

758
murvinlai

Buffers peut être utilisé pour prendre une chaîne ou un morceau de données et encoder en base64 le 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 étant un objet global, aucun besoin n'est requis. Les tampons créés avec des chaînes peuvent utiliser un paramètre de codage facultatif pour spécifier le codage de la chaîne. Les codages de constructeur toString et Buffer disponibles sont les suivants:

'ascii' - pour les données 7 bits ASCII uniquement. Cette méthode de codage est très rapide et supprime le bit fort si elle est définie.

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

'ucs2' - 2 octets, caractères Unicode codés en petit endian. Il ne peut encoder que BMP (Plan multilingue de base, U + 0000 - U + FFFF).

'base64' - Encodage de chaîne en base64.

'binary' - Méthode permettant 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 déconseillée et doit être évitée en faveur des objets Tampon, dans la mesure du possible. Ce codage sera supprimé dans les futures versions de Node.

1791
onteria_

La réponse acceptée contient ce qui est considéré comme un problème de sécurité dans les versions de nœud supérieures à 6 (bien qu'il semble probable pour cette cas d'utilisation que l'entrée puisse toujours être forcée en chaîne).

Le constructeur Buffer est obsolète en fonction de documentation .

Here est un exemple de vulnérabilité pouvant découler de son utilisation dans la bibliothèque ws.

Les extraits de code doivent se lire comme suit:

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

crypto supporte maintenant base64 ( reference ):

cipher.final('base64') 

Pour que vous puissiez 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');
40
Javier Ferrero

J'utilise le code suivant pour décoder la chaîne base64 dans la version 10.7.0 de l'API du nœud

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

S'il vous plaît, n'essayez pas de lancer le code ci-dessus dans la console du navigateur, cela ne fonctionnera pas. Placez le code dans les fichiers côté serveur de nodejs. J'utilise le code de ligne ci-dessus dans le développement de l'API.

0
Devendra Chhaiya