Como fazer codificação Base64 em node.js?

O node.js já possui codificação base64 embutida?

A razão pela qual eu pergunto isso é que final() da crypto só pode gerar dados hexadecimais, binários ou ascii. Por exemplo:

 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 acordo com os documentos, update() pode gerar dados codificados em base64. No entanto, final() não suporta base64. Eu tentei e vai quebrar.

Se eu fizer isso:

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

Então, o que devo usar para descriptografia? Hex ou base64?

Portanto, estou procurando uma function para codificar com base64 minha saída hexadecimal criptografada.

Obrigado.

Os buffers podem ser usados ​​para obter uma string ou um fragment de dados e fazer a codificação base64 do resultado. Por exemplo:

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

Os buffers são um object global, portanto, não é necessário. Os buffers criados com strings podem ter um parâmetro de codificação opcional para especificar em que codificação a string está. As codificações do construtor toString e Buffer disponíveis são as seguintes:

‘ascii’ – somente para dados ASCII de 7 bits. Esse método de codificação é muito rápido e tira o bit alto se definido.

‘utf8’ – Caracteres Unicode codificados por múltiplos bytes. Muitas páginas da Web e outros formatos de documentos usam o UTF-8.

‘ucs2’ – 2 bytes, little endian codificado em caracteres Unicode. Ele pode codificar apenas BMP (Plano Multilíngue Básico, U + 0000 – U + FFFF).

‘base64’ – codificação de string Base64.

‘binary’ – Uma maneira de codificar dados binários brutos em strings usando apenas os primeiros 8 bits de cada caractere. Esse método de codificação é obsoleto e deve ser evitado em favor de objects Buffer sempre que possível. Esta codificação será removida em futuras versões do Node.

A resposta aceita contém o que é considerado um problema de segurança em versões de nó maiores que 6 (embora pareça provável que, nesse caso, a input sempre possa ser forçada para uma string).

O construtor Buffer é reprovado de acordo com a documentação .

Aqui está um exemplo de uma vulnerabilidade que pode resultar da sua utilização na biblioteca ws.

Os trechos de código devem ler:

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

crypto agora suporta base64 ( referência ):

 cipher.final('base64') 

Então você poderia simplesmente fazer:

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