压缩和混淆node.js服务端代码
在前端我们有webpack,gulp等构建工具提供了从项目结构搭建到部署打包,基本所有工作流程所需要的都被覆盖到了。
在后台node.js写的服务端却是透明,很多时候我们不愿意交付透明的代码。这个时候就需要对js代码进行压缩混淆。
目的
我有一个
express
纯api后台项目,在发布之前我需要对他进行压缩混淆。在开发完成以后我希望执行一个命令就能得到完整,压缩混淆之后的代码。然后一个命令启动,运行,维护等。
方案查找
百度谷歌上网找文章。找到了下面几种方案,但是都没有很好的案例可以参考。
这里列出几个与js混淆,编译,打包相关的库或网站:
- 混淆
- JavaScript obfuscator-一个强大的JS混淆器。
- 萨满科技-一套JS代码安全问题解决方案。
- UglifyJS2 - 仅支持
ECMAScript 5
,更高的版本需要用Babel转换
- 编译
- bytenode,一个极简的Node.js字节码编译器。
- 打包
- ncc 可以把Node.js项目打包成一个js单文件,支持 TypeScript,动态导入。
- pkg 可以把Node.js项目打包成一个二进制的可执行文件,pkg不支持动态导入,但是会将Node本身一起打包,可以实现在没安装Node.js的环境运行。
- pmq20/node-packer 也能打包成一个二进制的可执行文件,它的优势在于支持各种形式的require, 也支持C++模块。可惜项目已经两年没更新了,只支持到Node.js 8.3.0, 对于更高版本的支持,请移步slee047/node-packer。
来源:https://juejin.im/post/5d89e996e51d453bc64802c0
作者:Winston_Lee
javascript-obfuscator
简介:A free and efficient obfuscator for JavaScript (including ES2017). Make your code harder to copy and prevent people from stealing your work. This tool is a Web UI to the excellent (and open source)
一个免费和高效的JavaScript混淆器(包括ES2017)。让你的代码更难复制,防止别人窃取你的成果。这个工具是一个优秀的Web UI(并且是开源的)
这个库很像在线
JavaScript
代码压缩网站,实际上也可以做一个在线压缩代码的网站。不过他吸引我的是他的cli工具。❗ 作者在
Github
上说了没有很多时间来维护这个项目了,使用请慎重考虑。
文档
官网文档:https://github.com/javascript-obfuscator/javascript-obfuscator/
自己翻译:https://sunseekerx.github.io/javascript-obfuscator-README.zh-CN.md/
使用
0x0 全局安装javascript-obfuscator
npm i javascript-obfuscator -g
0x1 例如一个express
项目,在项目根目录下新建javascript-obfuscator.json
{
"compact": true,
"controlFlowFlattening": true,
"controlFlowFlatteningThreshold": 0.75,
"deadCodeInjection": true,
"deadCodeInjectionThreshold": 0.4,
"debugProtection": false,
"debugProtectionInterval": false,
"disableConsoleOutput": true,
"identifierNamesGenerator": "hexadecimal",
"log": false,
"renameGlobals": false,
"rotateStringArray": true,
"selfDefending": true,
"stringArray": true,
"stringArrayEncoding": "base64",
"stringArrayThreshold": 0.75,
"transformObjectKeys": true,
"unicodeEscapeSequence": false
}
0x2 在package.json
的script
代码块中加上如下命令
下面命令会将压缩好的文件放在根目录下的
obfuscated
文件夹中,可以看到代码都是经过压缩混淆的,如果开启了selfDefending
选项,如果代码经过格式化工具格式化出来也是无法运行的。
javascript-obfuscator ./ --output ./obfuscated --exclude node_modules --config javascript-obfuscator.json
问题
- 以
.js
为后缀的文件会被压缩混淆但是其他的文件没有复制,达不到想要的开发完成一个命令压缩混淆代码,然后可以得到完成的可以部署的项目。(如果对shell脚本熟悉,可以自己写脚本实现。) - 项目已经停更,作者没有精力继续维护,存在不能用风险
UglifyJS2
UglifyJS是一个JavaScript解析器,缩小器,压缩器和美化工具包。
UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
Note:
uglify-js@3
has a simplified API and CLI that is not backwards compatible withuglify-js@2
.- Documentation for UglifyJS
2.x
releases can be found here.uglify-js
only supports JavaScript (ECMAScript 5).- To minify ECMAScript 2015 or above, transpile using tools like Babel.
官方GitHub仅仅支持ECMAScript 5,弃用。
总结
就目前来看并没有一个很好的方案去压缩混淆Node
的项目。不过javascript-obfuscator
已经很接近我想要的效果了。后续更多的使用体验或更多的选择,我会继续写一篇文章。