当我需要在Nodejs插件中加密/解密数据时,我使用了相同的方法。
据我所知,node_crypto.h
中的类用于在Nodejs中进行本地绑定,但我无法在我的插件中使用它们。
然后我尝试从Nodejs中使用OpenSSL,但由于OpenSSL静态链接到Nodejs可执行文件中,因此无法实现。
之后,我尝试从C++调用JavaScript代码,最终得到了以下解决方案 - 从C++代码中调用Nodejs函数:
using namespace v8;
static Persistent<Object> node_crypto;
void Init(Local<Object> exports, Local<Object> module)
{
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
Local<Function> require = module->Get(String::NewFromUtf8(isolate, "require")).As<Function>();
Local<Value> args[] = { String::NewFromUtf8(isolate, "crypto") };
Local<Object> crypto = require->Call(module, 1, args).As<Object>();
node_crypto.Reset(isolate, crypto);
}
NODE_MODULE(addon, Init);
std::string encrypt(std::string const& key, std::string const& text)
{
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
Local<Object> crypto = Local<Object>::New(isolate, node_crypto);
Local<Function> createCipher = crypto->Get(String::NewFromUtf8(isolate, "createCipher")).As<Function>();
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>();
Local<Function> update = cipher->Get(String::NewFromUtf8(isolate, "update")).As<Function>();
Local<Function> final = cipher->Get(String::NewFromUtf8(isolate, "final")).As<Function>();
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);
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)
{
}
正如您所见,使用V8 API的C++代码相当冗长。在实际项目中,我使用了我的v8pp库中的实用函数来获取对象属性,并带有数据转换到V8句柄的调用函数。
lib\*.js
。如果有人改变了源代码并运行了这个修改过的 Nodejs,它可能是不安全的。我只需要在应用程序启动时加密/解密一块数据一次。所以我没有对这个解决方案进行任何性能测试。 - pmedNODE_MODULE_INIT
宏,允许本地C++插件访问exports
、module
和context
。Node API是Node.js C++插件API的C语言抽象层,因此它可以放弃一些东西,以更抽象的方式呈现。 - pmed