在掘金文章《如何保护价值上千万的Node.js源代码?》中看到了很多Nodejs加密的工具,并做了尝试,以下是各种工具的实际使用情况。

node-packer

前面文章中作者使用的“JavaScript obfuscator + bytenode + node-packer”解决方案并不能直接拿过来解决现实问题。

首先作者只是用JavaScript obfuscator对单个文件做了处理,不过这个问题不大,后续讲 JavaScript obfuscator 的实践时会提到解决办法。

bytenode 使用正常,但是在用node-packer进行打包时出现没反应的情况,再看作者的介绍发现它只支持到Node.js 8.3.0,要安装它的分支slee047/node-packer才行。

但是 slee047/node-packer 并不能直接使用npm进行安装,而他需要环境要求又比较严格(见下图),让人望而却步了。

image.png

PKG

这个应该是nodejs打包使用最多的方案,github的star最多。

实际使用过程中,下载依赖包pkg-fetch,下载很久,尝试过人工下载,速度也不是很理想。

考虑到后期还要用自动化构建去完成下载之类的操作,构建时间会很长,暂时放弃。

JavaScript obfuscator

考虑直接使用JavaScript obfuscator做混淆,想着做简单处理也行。

看官方文档确定了执行命令 javascript-obfuscator ./dist --string-array-encoding rc4 --output ./pkg ,然后node ./pkg/index.js,结果提示: ECONNREFUSED 127.0.0.1:3306 ,经过研究发现是没办法识别nest的环境变量配置文件 development.env 的注入。

可以通过cli的环境变量注入,问题不大: DB_HOST=<数据库ip> DB_USERNAME=<数据库用户名> DB_PASSWORD=<数据库密码> DB_DATABASE=<数据库名称> node ./pkg/main.js

NCC

这个工具类似于pkg,它是后来出的编译工具,star数相对来说少一些。

安装依赖后使用 ncc build ./src/main.ts -o pkg 对工程目录的入口文件进行分析并编译出可执行代码到pkg目录下,最终它把整个工程编译成了唯一一个js文件。

运行node ./pkg/index.js 尝试运行,遇到了与JavaScript obfuscator一样的环境变量问题,这个好解决,用cli环境变量注入即可。

但是在运行DB_HOST=<数据库ip> DB_USERNAME=<数据库用户名> DB_PASSWORD=<数据库密码> DB_DATABASE=<数据库名称> node ./pkg/main.js 命令后出现了新的问题,提示如下:
image.png
经过排查发现它只能分析require、import的文件关联,而我们关联数据库model时使用了路径字符串拼接,ncc工具无法识别这个。

暂时没有想到好的解决办法。