項目是用Node.js作的,Node.js代碼須要保護嗎?javascript
通常狀況下不須要,由於代碼跑在雲端服務器上啊。只要服務器安全,Node.js代碼哪怕是明文,也是安全的。java
但是凡事不怕一萬,就怕萬一。假如某天甲方忽然要求作私有化部署,而你老闆爽快地答應了,並把這個問題丟給你。node
好吧,如今狀況改變了,你須要代碼部署在不信任的環境。一旦把Node.js源代碼在甲方的服務器進行打包或上線,那甲方就能夠輕易地查看,分析,篡改和複製你的代碼。git
有哪些方法能夠保護js代碼?程序員
思路是這樣的:通過保護的代碼要能正常運行(固然,不能運行的代碼有什麼用),同時還不能讓別人輕易地看到源碼。簡而言之,讓機器能讀懂,而人難以讀懂就好了。github
加密npm
咱們能夠對js代碼進行加密,每次執行前進行解密,實際運行的是解密後的代碼。可是加密對執行效率會有影響,並且一旦密碼被破解,源碼也就泄露了。json
混淆windows
對代碼進行混淆,儘可能地讓代碼變得不可讀,聽說這個思路是從代碼寫得不好的程序員身上學來的。常見的作法有:分離常量、打亂控制流、增長無心義代碼、域名鎖定、混淆字符串,禁用調試等方法。安全
編譯
Node.js代碼是經過V8引擎來執行的,而V8引擎會將源代碼編譯成字節碼(bytenode)以後再解釋執行。若是咱們能將Node.js代碼編譯成字節碼, 將會進一步提升代碼的安全性。畢竟反編譯V8的字節碼並不是易事。
打包
把Node.js代碼和依賴,打包成一個可執行文件。這樣能夠增長一點破解的難度。
這裏列出幾個與js混淆,編譯,打包相關的庫或網站:
混淆
編譯
打包
沒有絕對的安全可言,以上的方法只能是加大破解的難度。有道是世上無難事只怕有心人,只要有足夠的技術和耐心,仍是有可能還原出相應的代碼。
做爲防守方,咱們能作是儘量地多采用一些保護手段。在這裏,提供一個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。
有寫的不對的地方,但願各位看官能在評論裏不吝賜教。