Я проверял, можно ли распространять закрытое приложение приложения node.js
. Не клиентские Javascript файлы, а серверные файлы как коммерческий продукт. Я предполагаю, что обфускация/уклонение кода не обеспечит реальной конфиденциальности. Возможно, что-то вроде упаковки/компиляции исходного кода в двоичный файл может помочь. Возможно ли это?
Node.js защита кода
Ответ 1
Я немного искал код NodeJS и v8.
Сначала в репозитории NodeJS я обнаружил, что исходный код загружается сначала на src/ node.cc, строка 1128:
Local<Value> ExecuteString(Handle<String> source, Handle<Value> filename)
Которая сначала компилирует строку (и позже выполняет), используя:
Local<v8::Script> script = v8::Script::Compile(source, filename);
Взглянув на исходный код v8 на странице deps/v8/include/v8.h, строка 639, функция компиляции возвращает:
Compiled script object, bound to the context that was active
when this function was called. When run it will always use this
context.
Я не уверен, что подразумевается script, связанный с контекстом, но я бы сказал, что это не просто двоичный объект, который вы можете сохранить и перенести на другой компьютер, не передавая весь контекст.
EDIT: более глубокий взгляд на v8.h, также есть класс ScriptData, который предварительно компилирует script, чтобы сделать компиляцию быстрее и которая может использоваться с классом script, но script класс по-прежнему требует исходного источника при загрузке script. (Возможно, при печати ошибок он знает, где произошла ошибка.)
Таким образом, я не думаю, что это возможно без большой работы.
Ответ 2
Существует хороший метод, который вы можете попробовать - перекомпилируйте исходный код NodeJS.
Откройте папку nodejs src (nodejs-v0.xxx/lib/module.js), вы найдете следующее:
// Native extension for .js
Module._extensions['.js'] = function(module, filename) {
var content = NativeModule.require('fs').readFileSync(filename, 'utf8');
module._compile(stripBOM(content), filename);
};
Добавьте новое расширение, чтобы удовлетворить ваши потребности. Например:
// Native extension for .jse (encrypted js)
Module._extensions['.jse'] = function (module, filename) {
var content = stripBOM(NativeModule.require('fs').readFileSync(filename, 'utf8')).split('').reverse().join('');
module._compile(content, filename);
};
Затем перекомпилируйте nodejs и зашифруйте свой код и переименуйте расширение своего кода с xxx.js на xxx.jse.
Ответ 3
Известно, что V8 полностью компилирует JavaScript и выполняет его. EncloseJS использует эту функцию, чтобы скомпилировать исполняемый файл из проекта node.js. EncloseJS является компилятором для node/io.js - он дает вам такую же конфиденциальность, как классический компилятор.