Làm cách nào để mã hóa Base64 trong node.js?


839

Node.js đã tích hợp mã hóa base64 chưa?

Lý do tại sao tôi hỏi điều này là final()từ cryptochỉ có thể xuất dữ liệu hex, nhị phân hoặc ascii. Ví dụ:

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

Theo các tài liệu, update()có thể xuất dữ liệu được mã hóa base64. Tuy nhiên, final()không hỗ trợ cơ sở64. Tôi đã thử và nó sẽ phá vỡ.

Nếu tôi làm điều này:

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

Vậy thì tôi nên dùng gì để giải mã? Hex hay base64?

Do đó, tôi đang tìm kiếm một hàm để mã hóa đầu ra hex được mã hóa của tôi.


8
Đối với ai đó đang tìm kiếm vấn đề này trong / sau năm 2016 cipher.final('base64')hoạt động
avck

Câu trả lời:


1968

Bộ đệm có thể được sử dụng để lấy một chuỗi hoặc một phần dữ liệu và thực hiện mã hóa base64 của kết quả. Ví dụ:

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

Bộ đệm là một đối tượng toàn cầu, do đó không cần phải có. Bộ đệm được tạo bằng chuỗi có thể lấy tham số mã hóa tùy chọn để chỉ định mã hóa chuỗi đó là gì. Các mã hóa có sẵn toStringvà hàm Buffertạo như sau:

'ascii' - chỉ dành cho dữ liệu ASCII 7 bit. Phương pháp mã hóa này rất nhanh và sẽ loại bỏ bit cao nếu được đặt.

'utf8' - Ký tự Unicode được mã hóa nhiều byte. Nhiều trang web và các định dạng tài liệu khác sử dụng UTF-8.

'ucs2' - 2 byte, ký tự Unicode được mã hóa endian nhỏ. Nó chỉ có thể mã hóa BMP (Mặt phẳng đa ngôn ngữ cơ bản, U + 0000 - U + FFFF).

'Base64' - Mã hóa chuỗi Base64.

'binary' - Cách mã hóa dữ liệu nhị phân thô thành chuỗi bằng cách chỉ sử dụng 8 bit đầu tiên của mỗi ký tự. Phương pháp mã hóa này không được dùng nữa và nên tránh sử dụng các đối tượng Buffer nếu có thể. Mã hóa này sẽ bị xóa trong các phiên bản tương lai của Node.


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

.toString("binary")atob
Rốt cuộc

@ 12Me21 Tôi nghĩ nó là viết tắt của ascii cho cơ sở64?
David Callanan

@DavidCallanan atob () chuyển đổi từ cơ
sở64

@ 12Me21 Ok cảm ơn vì đã làm rõ
David Callanan

221

Câu trả lời được chấp nhận trước đây new Buffer() , được coi là vấn đề bảo mật trong các phiên bản nút lớn hơn 6 (mặc dù có vẻ như đối với usecase này, đầu vào luôn có thể bị ép buộc thành một chuỗi).

Các nhà Bufferxây dựng được phản đối theo tài liệu .

Dưới đây là một ví dụ về lỗ hổng có thể xảy ra do sử dụng nó trong thư viện ws.

Các đoạn mã nên đọc:

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

Sau khi câu trả lời này được viết, nó đã được cập nhật và bây giờ phù hợp với điều này.


Khi tôi cố gắng sử dụng dòng đầu tiên của bạn, Node trả về: [TypeError: đây không phải là một mảng được gõ.]
Dave Voyles

7
Lỗi này xảy ra trên các phiên bản nút cũ hơn v6. Trong các phiên bản này, bạn sẽ cần sử dụng hàm tạo ( new Buffer) chứ không phải Buffer.from.
NotJavanese

Buffer.from () đã được thêm vào trong v4.5.0.
dskrvk

72
Chỉ để tiết kiệm cho bạn vài phút mà tôi đã mất khi cố gắng nhìn thấy sự khác biệt giữa ví dụ này và câu trả lời được chấp nhận, câu trả lời được chấp nhận hiện được cập nhật với những gì câu trả lời này gợi ý.
Kunok

39

tiền điện tử hiện hỗ trợ base64 ( tham khảo ):

cipher.final('base64') 

Vì vậy, bạn có thể chỉ cần làm:

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
Bất kỳ lý do để sử dụng điều này trên câu trả lời của NotJavanese?
Trevor

3
Phải khớp mã hóa giữa Node và Python và câu trả lời này đã tiết kiệm cho tôi một câu hỏi! Cảm ơn :)
GigiSan

1

Bộ đệm có thể được sử dụng để lấy một chuỗi hoặc một phần dữ liệu và thực hiện mã hóa base64 của kết quả. Ví dụ:

Bạn có thể cài đặt Bộ đệm qua npm như: -npm i buffer --save

bạn có thể sử dụng nó trong jstập tin của bạn như thế này: -

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

Tôi đang sử dụng đoạn mã sau để giải mã chuỗi base64 trong nút API nodejs phiên bản 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 + '"'); 

Vui lòng không thử chạy mã trên trong bảng điều khiển của trình duyệt, sẽ không hoạt động. Đặt mã trong các tập tin phía máy chủ của nodejs. Tôi đang sử dụng mã dòng trên để phát triển API.


0

Tôi đã tạo ra một tối hậu js nhỏ NPM thư viện cho việc chuyển đổi mã hóa base64 / giải mã trong Node.js.

Cài đặt

npm install nodejs-base64-converter --save

Sử dụng

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

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

0

Bạn có thể thực hiện mã hóa và giải mã base64 với javascript đơn giản.

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

Điều này được thực hiện trong bộ giải mã bộ mã hóa Base64 này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.