2015-11-05 7 views
6

से मॉड्यूल में निर्मित node.js का उपयोग कैसे करें मुझे अपने सी ++ एडन से मॉड्यूल 'क्रिप्टो' में निर्मित node.js का उपयोग करने की आवश्यकता है। मैंने सी ++ एडॉन्स के उदाहरण खोजने की कोशिश की जो मॉड्यूल में निर्मित का उपयोग करते हैं, लेकिन असफल रहे। मैंने node_crypto.h/.cc में देखा और इसमें node.js क्रिप्टो प्रलेखन, संरक्षित कन्स्ट्रक्टर इत्यादि की तुलना में बहुत अलग फ़ंक्शन हस्ताक्षर हैं। Node_crypto.h में एक पैरामीटर के साथ InitCrypto() घोषणा है, लेकिन node_crypto.cc की परिभाषा नहीं है ऐसा कार्य चार पैरामीटर के साथ केवल InitCrypto है। मैंने किसी भी पैरामीटर के साथ InitCrypto का उपयोग करने की कोशिश की और "प्रतीक लुकअप त्रुटि" मिली।सी ++ एडॉन्स

मैं अपने एडन में आवश्यकता ('क्रिप्टो') के परिणाम पास कर सकता हूं और फिर इस ऑब्जेक्ट के साथ काम कर सकता हूं, लेकिन यह इतना असुरक्षित है। हमारा जेएस कोड क्लाइंट के सर्वर पर काम करता है।

अब के लिए मुझे लगता है कि सी ++ एडन के लिए नोड मॉड्यूल 'क्रिप्टो' में निर्मित की बजाय openssl lib की तरह smth का उपयोग करना आसान है।

तो मुझे सी ++ एडन के साथ कुछ काम करने का उदाहरण चाहिए जो 'क्रिप्टो' मॉड्यूल का उपयोग कर रहा है या इसके बारे में कुछ लेख से लिंक है।

सी ++ एडन से निर्मित किसी भी मॉड्यूल का उपयोग करने वाला कोई भी उदाहरण उपयोगी होगा।

उत्तर

6

मैंने उसी तरह उपयोग किया जब किसी नोडज एडन में डेटा एन्क्रिप्ट/डिक्रिप्ट करने की आवश्यकता थी।

जैसा कि मैं समझता हूं, node_crypto.h से कक्षाएं नोडजेस में देशी बाइंडिंग करने के लिए उपयोग की जाती हैं, मैं उन्हें अपने एडन में उपयोग नहीं कर सका।

फिर मैंने ओपनएसएसएल को नोडजेस से उपयोग करने का प्रयास किया लेकिन ऐसा नहीं कर सका क्योंकि ओपनएसएसएल स्थिर रूप से नोडज निष्पादन योग्य में जुड़ा हुआ है।

उसके बाद मैं सी से एक जावा स्क्रिप्ट कोड कॉल करने की कोशिश ++ और अंत में निम्नलिखित समाधान मिला - सी ++ कोड से NodeJS कार्यों को लागू करने की:

using namespace v8; 

// persistent handle for the crypto module 
static Persistent<Object> node_crypto; 

// Addon startup procedure 
void Init(Local<Object> exports, Local<Object> module) 
{ 
    Isolate* isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 

    // get `require` function 
    Local<Function> require = module->Get(String::NewFromUtf8(isolate, "require")).As<Function>(); 

    // call require('crypto') 
    Local<Value> args[] = { String::NewFromUtf8(isolate, "crypto") }; 
    Local<Object> crypto = require->Call(module, 1, args).As<Object>(); 

    // store crypto module in persistent handle for further use 
    node_crypto.Reset(isolate, crypto); 
} 

NODE_MODULE(addon, Init); 

// must be invoked in then Node main thread since the function uses V8 API 
std::string encrypt(std::string const& key, std::string const& text) 
{ 
    Isolate* isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 

    // get local handle from persistent 
    Local<Object> crypto = Local<Object>::New(isolate, node_crypto); 

    // get `createCipher` function from the crypto module 
    Local<Function> createCipher = crypto->Get(String::NewFromUtf8(isolate, "createCipher")).As<Function>(); 

    // call crypto.createCipher("aes256", key) 
    Local<Value> create_args[] = 
    { 
     String::NewFromUtf8(isolate, "aes256"), 
     String::NewFromUtf8(isolate, key.c_str()) 
    }; 
    Local<Object> cipher = createCipher->Call(crypto, 2, create_args).As<Object>(); 

    // get update and final functions from the crypto module 
    Local<Function> update = cipher->Get(String::NewFromUtf8(isolate, "update")).As<Function>(); 
    Local<Function> final = cipher->Get(String::NewFromUtf8(isolate, "final")).As<Function>(); 

    // buf1 = cipher.update(text), buf2 = cipher.final() 
    Local<Value> update_args[] = { node::Buffer::New(isolate, text.data(), text.size()) }; 

    Local<Value> buf1 = update->Call(cipher, 1, update_args); 
    Local<Value> buf2 = final->Call(cipher, 0, nullptr); 

    // concatenate update and final buffers into result string 
    char const* const data1 = node::Buffer::Data(buf1); 
    char const* const data2 = node::Buffer::Data(buf2); 

    size_t const size1 = node::Buffer::Length(buf1); 
    size_t const size2 = node::Buffer::Lenght(buf2); 

    std::string result; 
    result.reserve(size1 + size2); 
    result.append(data1, size1); 
    result.append(data2, size2); 
    return result; 
} 

std::string decrypt(std::string const& key, std::string const& text) 
{ 
    // similar as in encrypt, use createDecipher instead 
} 

आप देख सकते हैं, सी ++ वी 8 एपीआई के साथ कोड काफी वर्बोज़ है । वास्तविक प्रोजेक्ट में मैंने ऑब्जेक्ट गुण प्राप्त करने और वी 8 हैंडल में डेटा रूपांतरण के साथ कॉल फ़ंक्शंस प्राप्त करने के लिए अपने v8pp लाइब्रेरी से उपयोगिता फ़ंक्शंस का उपयोग किया।

+0

बड़ा धन्यवाद! यह समाधान एडन के लिए आवश्यकता ('क्रिप्टो') के परिणाम पास करने के बाद और अधिक सुरक्षित है। अगर नवंबर के अंत तक कोई भी शुद्ध सी ++ समाधान पोस्ट नहीं करेगा, तो मैं इसे उत्तर के रूप में चिह्नित करूंगा। क्या मैं सही ढंग से समझता हूं कि कोई भी node_src_root/lib/*। जेएस फाइलों में मॉड्यूल में निर्मित सही कर सकता है और इन सही * .js फ़ाइलों को एडन द्वारा उपयोग किया जाएगा? क्या आपने कोई प्रदर्शन परीक्षण किया था? कहें, वैश्विक वस्तुओं में कुछ फ़ंक्शंस को कैश करने और तृतीय पक्ष क्रिप्टो libs के साथ तुलना करने का प्रयास करें? – Dzenly

+1

मैंने इसे अपने एडन में बाहरी क्रिप्टो लाइब्रेरी निर्भरता से बचने के लिए एक त्वरित और गंदे तरीके के रूप में उपयोग किया, क्योंकि ओपनएसएसएल जैसी ऐसी चीजें बनाना सिरदर्द होगा। हां, आप सही हैं इस समाधान ने नोड स्रोतों से 'lib \ *। Js' का उपयोग किया। अगर किसी ने स्रोत बदल दिए हैं और इस संशोधित नोडज को चलाएंगे तो यह असुरक्षित हो सकता है। मुझे एप्लिकेशन शुरू होने पर केवल एक बार डेटा के ब्लॉक को एन्क्रिप्ट/डिक्रिप्ट करने की आवश्यकता थी। तो मैंने इस समाधान के लिए कोई प्रदर्शन परीक्षण नहीं किया। – pmed

+0

ग्रेट सॉल्यूशन! – Icebob

संबंधित मुद्दे