[node.js] node.js에서 Base64 인코딩을 수행하는 방법은 무엇입니까?

node.js에 아직 base64 인코딩이 내장되어 있습니까?

내가 묻는 이유는 final()from에서 crypto16 진수, 이진 또는 ASCII 데이터 만 출력 할 수 있기 때문 입니다. 예를 들면 다음과 같습니다.

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

문서에 따르면 update()base64로 인코딩 된 데이터를 출력 할 수 있습니다. 그러나 final()base64는 지원하지 않습니다. 나는 노력했고 그것이 깨질 것이다.

내가 이렇게하면 :

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

그렇다면 해독에 무엇을 사용해야합니까? 16 진수 또는 base64?

따라서 암호화 된 16 진수 출력을 base64로 인코딩하는 기능을 찾고 있습니다.



답변

버퍼 는 문자열 또는 데이터를 가져 와서 결과의 base64 인코딩을 수행하는 데 사용할 수 있습니다. 예를 들면 다음과 같습니다.

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

버퍼는 전역 객체이므로 필요하지 않습니다. 문자열로 작성된 버퍼는 문자열의 인코딩을 지정하기 위해 선택적 인코딩 매개 변수를 사용할 수 있습니다. 사용 가능한 toStringBuffer생성자 인코딩은 다음과 같습니다.

‘ascii’-7 비트 ASCII 데이터에만 해당합니다. 이 인코딩 방법은 매우 빠르며 설정된 경우 높은 비트를 제거합니다.

‘utf8’-멀티 바이트 인코딩 유니 코드 문자 많은 웹 페이지 및 기타 문서 형식은 UTF-8을 사용합니다.

‘ucs2’-2 바이트, 리틀 엔디안 인코딩 유니 코드 문자 BMP (Basic Multilingual Plane, U + 0000-U + FFFF) 만 인코딩 할 수 있습니다.

‘base64’-Base64 문자열 인코딩

‘binary’-각 문자의 처음 8 비트 만 사용하여 원시 이진 데이터를 문자열로 인코딩하는 방법입니다. 이 인코딩 방법은 더 이상 사용되지 않으며 가능한 경우 Buffer 객체를 선호하지 않아야합니다. 이 인코딩은 향후 버전의 Node에서 제거 될 예정입니다.


답변

이전에 허용 된 답변 new Buffer()은 6보다 큰 노드 버전의 보안 문제로 간주됩니다 (이 사용 사례에서는 입력을 항상 문자열로 강제 변환 할 수 있음).

Buffer생성자가에 따라되지 않습니다 문서 .

다음은 ws 라이브러리에서이 취약점 을 사용하여 발생할 수 있는 취약점예입니다 .

코드 스 니펫은 다음과 같아야합니다.

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

이 답변이 작성된 후에는 업데이트되었으며 이제 일치합니다.


답변

암호화는 이제 base64 ( reference )를 지원합니다 :

cipher.final('base64') 

따라서 간단하게 할 수 있습니다.

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


답변

버퍼 는 문자열 또는 데이터를 가져 와서 결과의 base64 인코딩을 수행하는 데 사용할 수 있습니다. 예를 들면 다음과 같습니다.

npm을 통해 Buffer 를 설치할 수 있습니다 :-npm i buffer --save

다음 js과 같이 파일 에서 이것을 사용할 수 있습니다 :-

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


답변

노드 API nodejs 버전 10.7.0에서 base64 문자열을 디코딩하기 위해 다음 코드를 사용하고 있습니다

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

브라우저 콘솔에서 위의 코드를 실행하지 마십시오. 작동하지 않습니다. nodejs의 서버 측 파일에 코드를 넣습니다. API 개발에서 위의 코드를 사용하고 있습니다.


답변

Node.js에서 base64 인코딩 / 디코딩 변환을위한 최고의 작은 js npm 라이브러리를 만들었습니다 .

설치

npm install nodejs-base64-converter --save

용법

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

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


답변

간단한 자바 스크립트로 base64 인코딩 및 디코딩을 수행 할 수 있습니다.

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

이것은이 Base64 인코더 디코더 에서 구현됩니다.