如何保护价值上千万的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。

有写的不对的地方,但愿各位看官能在评论里不吝赐教。

相关文章
相关标签/搜索