Base64 को नोड.जेएस में एन्कोडिंग कैसे करें?


839

क्या नोड.जेड में अंतर्निहित बेस 64 एनकोडिंग अभी तक है?

कारण है कि मैं इस पूछना है कि final()से cryptoकेवल उत्पादन हेक्स, द्विआधारी या 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()बेस 64-एन्कोडेड डेटा को आउटपुट कर सकता है। हालाँकि, final()बेस 64 का समर्थन नहीं करता है। मैंने कोशिश की और यह टूट जाएगा।

अगर मैं ऐसा करता हूं:

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

फिर डिक्रिप्शन के लिए मुझे क्या उपयोग करना चाहिए? हेक्स या बेस 64?

इसलिए, मैं अपने एन्क्रिप्टेड हेक्स आउटपुट को बेस-एनकोड करने के लिए एक फ़ंक्शन की तलाश कर रहा हूं।


8
किसी को 2016 के बाद / में इस समस्या की तलाश के लिए cipher.final('base64')काम करता है
avck

जवाबों:


1963

बफ़र्स का उपयोग डेटा का एक स्ट्रिंग या टुकड़ा लेने और परिणाम के base64 एन्कोडिंग करने के लिए किया जा सकता है। उदाहरण के लिए:

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

बफ़र एक वैश्विक वस्तु है, इसलिए कोई आवश्यकता नहीं है। स्ट्रिंग से एन्कोडिंग करने के लिए स्ट्रिंग के साथ बनाए गए बफ़र्स वैकल्पिक एन्कोडिंग पैरामीटर ले सकते हैं। उपलब्ध toStringऔर Bufferकंस्ट्रक्टर एन्कोडिंग निम्नानुसार हैं:

'ascii' - केवल 7 बिट ASCII डेटा के लिए। यह एन्कोडिंग विधि बहुत तेज़ है, और सेट होने पर उच्च बिट को छीन लेगी।

'utf8' - मल्टी बाइट ने यूनिकोड वर्णों को एनकोड किया। कई वेब पेज और अन्य दस्तावेज़ प्रारूप UTF-8 का उपयोग करते हैं।

'ucs2' - 2-बाइट्स, थोड़ा एंडियन यूनिकोड वर्णों को एन्कोड किया गया। यह केवल BMP (मूल बहुभाषी विमान, U + 0000 - U + FFFF) को एन्कोड कर सकता है।

'बेस 64' - बेस 64 स्ट्रिंग एन्कोडिंग।

'बाइनरी' - प्रत्येक वर्ण के केवल पहले 8 बिट्स का उपयोग करके कच्चे बाइनरी डेटा को तार में एन्कोडिंग करने का एक तरीका। इस एन्कोडिंग विधि को पदावनत किया जाता है और जहां संभव हो वहां बफर ऑब्जेक्ट के पक्ष में टाला जाना चाहिए। इस एन्कोडिंग को नोड के भविष्य के संस्करणों में हटा दिया जाएगा।


2
const atob = (data) => Buffer.from(data, 'base64').toString('ascii');
स्पेंसर.स्मिन

वह होना चाहिए .toString("binary")( atobबाइनरी के लिए ascii (base64), सब के बाद)
12M2121

@ 12M21 मुझे लगा कि यह एसियासी से बेस 64 तक है?
डेविड कॉलनान

@DavidCallanan atob () बेस 64 से परिवर्तित होता है
12M2121

@ 12Me21 ठीक करने के लिए धन्यवाद
डेविड

221

पहले से स्वीकार किए गए उत्तर में निहितnew Buffer() , जिसे 6 से अधिक नोड संस्करणों में एक सुरक्षा मुद्दा माना जाता है (हालांकि यह इस usecase के लिए संभावना है कि इनपुट को हमेशा एक स्ट्रिंग के लिए मजबूर किया जा सकता है)।

Bufferनिर्माता के अनुसार अब मान्य नहीं है प्रलेखन

यहां भेद्यता का एक उदाहरण दिया गया है जो ws लाइब्रेरी में इसका उपयोग करने के परिणामस्वरूप हो सकता है।

कोड स्निपेट को पढ़ना चाहिए:

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

इस उत्तर के लिखे जाने के बाद, इसे अपडेट किया गया है और अब यह मेल खाता है।


जब मैं आपकी पहली पंक्ति का उपयोग करने की कोशिश करता हूं, तो नोड रिटर्न करता है: [टाइपर्रर: यह टाइप किया गया सरणी नहीं है।]
डेव वॉयल्स

7
यह त्रुटि v6 से पुराने नोड संस्करणों पर होती है। इन संस्करणों में आपको कंस्ट्रक्टर ( new Buffer) के बजाय का उपयोग करना होगा Buffer.from
नॉटज्वानीज

Buffer.from () v4.5.0 में जोड़ा गया था।
dskrvk

71
बस आपको कुछ मिनट बचाने के लिए जो मैंने इस उदाहरण और स्वीकृत उत्तर के बीच अंतर देखने की कोशिश में खो दिया, स्वीकृत उत्तर अब अपडेट किया गया है जो यह उत्तर बताता है।
कुनोक

39

क्रिप्टो अब बेस 64 ( संदर्भ ) का समर्थन करता है :

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

3
NotJavanese के उत्तर पर इसका उपयोग करने का कोई कारण?
ट्रेवर

3
नोड और पायथन के बीच एनक्रिप्ट का मिलान करना था और इस जवाब ने मुझे एक सवाल बचा दिया! धन्यवाद :)
गिगीसन

1

बफ़र्स का उपयोग डेटा का एक स्ट्रिंग या टुकड़ा लेने और परिणाम के base64 एन्कोडिंग करने के लिए किया जा सकता है। उदाहरण के लिए:

आप npm के माध्यम से बफर स्थापित कर सकते हैं जैसे: -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

0

मैं नोड API नोडज संस्करण 10.7.0 में बेस 64 स्ट्रिंग को डीकोड करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं

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

कृपया ब्राउज़र के कंसोल में ऊपर कोड चलाने की कोशिश न करें, काम नहीं करेगा। नोडज के सर्वर साइड फाइलों में कोड डालें। मैं एपीआई विकास में उपरोक्त लाइन कोड का उपयोग कर रहा हूं।


0

मैंने Node.js. में बेस 64 एनकोड / डिकोड रूपांतरण के लिए एक परम छोटा सा 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.