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