如何保護價值上千萬的Node.js源代碼?

甲方忽然要求作私有化部署

項目是用Node.js作的,Node.js代碼須要保護嗎?javascript

通常狀況下不須要,由於代碼跑在雲端服務器上啊。只要服務器安全,Node.js代碼哪怕是明文,也是安全的。java

但是凡事不怕一萬,就怕萬一。假如某天甲方忽然要求作私有化部署,而你老闆爽快地答應了,並把這個問題丟給你。node

好吧,如今狀況改變了,你須要代碼部署在不信任的環境。一旦把Node.js源代碼在甲方的服務器進行打包或上線,那甲方就能夠輕易地查看,分析,篡改和複製你的代碼。git

因而開始谷歌

有哪些方法能夠保護js代碼?程序員

思路是這樣的:通過保護的代碼要能正常運行(固然,不能運行的代碼有什麼用),同時還不能讓別人輕易地看到源碼。簡而言之,讓機器能讀懂,而人難以讀懂就好了。github

  1. 加密npm

    咱們能夠對js代碼進行加密,每次執行前進行解密,實際運行的是解密後的代碼。可是加密對執行效率會有影響,並且一旦密碼被破解,源碼也就泄露了。json

  2. 混淆windows

    對代碼進行混淆,儘可能地讓代碼變得不可讀,聽說這個思路是從代碼寫得不好的程序員身上學來的。常見的作法有:分離常量、打亂控制流、增長無心義代碼、域名鎖定、混淆字符串,禁用調試等方法。安全

  3. 編譯

    Node.js代碼是經過V8引擎來執行的,而V8引擎會將源代碼編譯成字節碼(bytenode)以後再解釋執行。若是咱們能將Node.js代碼編譯成字節碼, 將會進一步提升代碼的安全性。畢竟反編譯V8的字節碼並不是易事。

  4. 打包

    把Node.js代碼和依賴,打包成一個可執行文件。這樣能夠增長一點破解的難度。

而後從github上抄代碼

這裏列出幾個與js混淆,編譯,打包相關的庫或網站:

  1. 混淆

  2. 編譯

    • bytenode,一個極簡的Node.js字節碼編譯器。
  3. 打包

    • 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

選出一個方案交差

沒有絕對的安全可言,以上的方法只能是加大破解的難度。有道是世上無難事只怕有心人,只要有足夠的技術和耐心,仍是有可能還原出相應的代碼。

做爲防守方,咱們能作是儘量地多采用一些保護手段。在這裏,提供一個JavaScript obfuscator + bytenode + node-packer的解決方案。

爲何選用node-packer而不是ncc,pkg呢?由於ncc和pkg沒法處理混淆過的代碼。

保護價值上千萬的代碼

假設咱們須要保護的是這樣的一個項目:

// index.js
console.log("如下是價值上千萬的代碼:");
var a = 1;
var b = 1;
var c = a + b;
console.log("1 + 1 = " + c)
複製代碼

首先咱們經過npm安裝javascript-obfuscator 和 bytenode。而後在當前系統下安裝node-packer。

因爲node-packer沒法打包由bytenode生成的.jsc字節碼文件,因此須要添加如下文件來導入.jsc文件:

// build.js
require('bytenode');

require('./index-obfuscated.jsc');
複製代碼

接着將如下指令加到package.json:

"scripts": {
    "obfuscate": "javascript-obfuscator index.js --string-array-encoding rc4",
    "bytenode": "bytenode --compile index-obfuscated.js",
    "nodec": "nodec build.js --skip-npm-install",
    "build": "npm run obfuscate && npm run bytenode && npm run nodec",
  }
複製代碼

最後運行npm run build,能夠獲得一個a.out(windows系統下是a.exe)的可執行文件。運行一下,價值上千萬的代碼就跑起來了。

此外你會發現項目目錄下多了兩個文件:index-obfuscated.js, index-obfuscated.jsc。它們分別是混淆以後的代碼以及字節碼文件。javascript-obfuscator支持多種混淆技術,可能經過查看文檔,按照本身的項目需求,調配選用合適的選項。

結語

除了以上技術手段,別忘了加上license,註明版權信息。

感謝看到最後,最後我將爲你免費提供這份價值上千萬的代碼示例。項目地址是javascript-code-protection-example,歡迎star。

有寫的不對的地方,但願各位看官能在評論裏不吝賜教。

相關文章
相關標籤/搜索