如题。最近公司给了个任务,要尽可能地加密node.js,因为部分系统要放在友商的服务器上运行,不想代码泄露,我把node中核心的业务代码加密后放进c++里,通过调用时输出,并通过判断调用它的node文件的md5值强制调用的node文件不可修改,否则启动报错。但遇到一个关键问题是,如何在c++里判断哪个node文件调用了它,如果能做到这一步就完美了。当然如果实在做不到,我只能在启动时强制清除所有node进程,只保留我自己的node项目进程…希望大家给我提一点思路…
考虑使用 pkg 打包成二进制
@GopherJ 等好久终于有人回了,谢谢先…这个pkg是如何命中我要解决的问题的?我贴子的意思是,如何在c++的代码中,自动获取调用它的node文件的路径…
@GopherJ 啊,还是说这个pkg是把整个项目打包??
不好意思我可能没认真看你的需求,如果我没理解错的话你只需要加密nodejs放到友商服务器上,那你完全可以将整个项目打包成二进制,有 assets 的话需要注意处理。
@GopherJ 似乎可行,但我们也要频繁升级,这样就麻烦了…
升级是指? 我的一个小项目目前是通过一个脚本编译成二进制发布
const ora = require('ora');
const os = require('os');
const chalk = require('chalk');
const { exec } = require('pkg');
const os_map = {
'linux' : 'linux',
'win32' : 'win',
'darwin' : 'osx'
};
const node_version = 8;
const platform = os.platform();
const spinner = ora('Compiling...').start();
const compile = async (target) => {
return await exec([
'dist/index.js',
'--target',
`node${node_version}-${target}-x64`,
'--out-dir',
`../bin/${target}-x64`
]);
};
compile(process.env.TARGET_OS || os_map[platform])
.then(_ => {
spinner.stop();
process.stdout.write(chalk.cyan('\n Build complete!'));
})
.catch(_ => {
spinner.stop();
});
您可以参考下
@GopherJ 先谢谢,我的升级是指直接替换系统里的业务路由,因系统的业务路由有版本上的区分,若某个版本有问题或新增业务处理流程,就需要在修复后直接替换。我想问下是否您这个解决方安案,可是否以把一个项目分成多个二进制包装并关联起来运行?
@GopherJ 您好,我试了下似乎可行,我想再了解一下,经过pkg处理的文件,有没办法再还原出代码的?
调用时传参数 __filename, webpack压损混淆js
来自酷炫的 CNodeMD
@zswnew 您好,现在怕的是有人非法传参,没调用__filename,这而是直接写死了其它参数值.混淆倒有的
node怎么做,c++就做一次模拟就好了。
#include <nan.h>
#include<stdio.h>
const char* ToCString(const v8::String::Utf8Value& value) {
return *value ? *value : "<string conversion failed>";
}
void getFilePath(const Nan::FunctionCallbackInfo<v8::Value>& info)
{
v8::Local<v8::Object> global = Nan::GetCurrentContext()->Global();
v8::Local<v8::Object> process = global->Get(v8::String::NewFromUtf8(info.GetIsolate(), "process", v8::NewStringType::kNormal).ToLocalChecked())->ToObject();
v8::Local<v8::Object> mainModule = process->Get(v8::String::NewFromUtf8(info.GetIsolate(), "mainModule", v8::NewStringType::kNormal).ToLocalChecked())->ToObject();
v8::Local<v8::String> filename = mainModule->Get(v8::String::NewFromUtf8(info.GetIsolate(), "filename", v8::NewStringType::kNormal).ToLocalChecked())->ToString();
v8::String::Utf8Value filename_str(info.GetIsolate(), filename);
printf("%s\r\n",ToCString(filename_str));
info.GetReturnValue().Set(filename);
}
但作为js开发者,我还是更建议使用wasm,更方便更高效更多环境支持更未来。 作为js团队,我不可能让团队每一个人都了解V8底层和过多的C++,这对团队效率来说损耗太大了。
@zy445566 非常非常感谢~~~,你讲的也很在理…目前的话,底层方面倒是只有我一个人在做这些事,忝为技术经理,但学习劲头已经不如很多年轻的同事了,只能硬着头皮赶一赶;团队成员还是以JS的技术栈为主,但无奈的是,自身纵观与把控全局的能力提升太难,现在也就只能遇到一个技术要点就寻求一下帮助,不想这样,但已是能力所限了…再次感谢
@wldlzt 惭愧,我也是运气好,恰好知道这一点。别的方向上也是要大量提问的,但有的时候反倒缺少这样的勇气,真的很惭愧。楼主能这样,我是打心底里佩服的。
@zy445566 客气了~~~~