壓縮和混淆node.js服務端代碼
在前端我們有webpack,gulp等構(gòu)建工具提供了從項目結(jié)構(gòu)搭建到部署打包,基本所有工作流程所需要的都被覆蓋到了。
在后臺node.js寫的服務端卻是透明,很多時候我們不愿意交付透明的代碼。這個時候就需要對js代碼進行壓縮混淆。
目的
我有一個
express純api后臺項目,在發(fā)布之前我需要對他進行壓縮混淆。在開發(fā)完成以后我希望執(zhí)行一個命令就能得到完整,壓縮混淆之后的代碼。然后一個命令啟動,運行,維護等。
方案查找
百度谷歌上網(wǎng)找文章。找到了下面幾種方案,但是都沒有很好的案例可以參考。
這里列出幾個與js混淆,編譯,打包相關(guān)的庫或網(wǎng)站:
- 混淆
- JavaScript obfuscator-一個強大的JS混淆器。
- 薩滿科技-一套JS代碼安全問題解決方案。
-
UglifyJS2 - 僅支持
ECMAScript 5,更高的版本需要用Babel轉(zhuǎn)換
- 編譯
- bytenode,一個極簡的Node.js字節(jié)碼編譯器。
- 打包
- ncc 可以把Node.js項目打包成一個js單文件,支持 TypeScript,動態(tài)導入。
- pkg 可以把Node.js項目打包成一個二進制的可執(zhí)行文件,pkg不支持動態(tài)導入,但是會將Node本身一起打包,可以實現(xiàn)在沒安裝Node.js的環(huán)境運行。
- pmq20/node-packer 也能打包成一個二進制的可執(zhí)行文件,它的優(yōu)勢在于支持各種形式的require, 也支持C++模塊??上ы椖恳呀?jīng)兩年沒更新了,只支持到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)。讓你的代碼更難復制,防止別人竊取你的成果。這個工具是一個優(yōu)秀的Web UI(并且是開源的)
官網(wǎng):https://obfuscator.io/
這個庫很像在線
JavaScript代碼壓縮網(wǎng)站,實際上也可以做一個在線壓縮代碼的網(wǎng)站。不過他吸引我的是他的cli工具。? 作者在
Github上說了沒有很多時間來維護這個項目了,使用請慎重考慮。
文檔
官網(wǎng)文檔: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文件夾中,可以看到代碼都是經(jīng)過壓縮混淆的,如果開啟了selfDefending選項,如果代碼經(jīng)過格式化工具格式化出來也是無法運行的。
javascript-obfuscator ./ --output ./obfuscated --exclude node_modules --config javascript-obfuscator.json
問題
- 以
.js為后綴的文件會被壓縮混淆但是其他的文件沒有復制,達不到想要的開發(fā)完成一個命令壓縮混淆代碼,然后可以得到完成的可以部署的項目。(如果對shell腳本熟悉,可以自己寫腳本實現(xiàn)。) - 項目已經(jīng)停更,作者沒有精力繼續(xù)維護,存在不能用風險
UglifyJS2
UglifyJS是一個JavaScript解析器,縮小器,壓縮器和美化工具包。
UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
Note:
uglify-js@3has a simplified API and CLI that is not backwards compatible withuglify-js@2.- Documentation for UglifyJS
2.xreleases can be found here.uglify-jsonly supports JavaScript (ECMAScript 5).- To minify ECMAScript 2015 or above, transpile using tools like Babel.
官方GitHub僅僅支持ECMAScript 5,棄用。
總結(jié)
就目前來看并沒有一個很好的方案去壓縮混淆Node的項目。不過javascript-obfuscator已經(jīng)很接近我想要的效果了。后續(xù)更多的使用體驗或更多的選擇,我會繼續(xù)寫一篇文章。