如何保护价值上千万的Node.js源代码? - 掘金

甲方突然要求做私有化部署

项目是用Node.js做的,Node.js代码需要保护吗?

一般情况下不需要,因为代码跑在云端服务器上啊。只要服务器安全,Node.js代码哪怕是明文,也是安全的。

可是凡事不怕一万,就怕万一。假如某天甲方突然要求做私有化部署,而你老板爽快地答应了,并把这个问题丢给你。

好吧,现在情况改变了,你需要代码部署在不信任的环境。一旦把Node.js源代码在甲方的服务器进行打包或上线,那甲方就可以轻易地查看,分析,篡改和复制你的代码。

于是开始谷歌

有哪些方法可以保护js代码?

思路是这样的:经过保护的代码要能正常运行(当然,不能运行的代码有什么用),同时还不能让别人轻易地看到源码。简而言之,让机器能读懂,而人难以读懂就行了。

  1. 加密

    我们可以对js代码进行加密,每次执行前进行解密,实际运行的是解密后的代码。但是加密对执行效率会有影响,而且一旦密码被破解,源码也就泄露了。

  2. 混淆

    对代码进行混淆,尽量地让代码变得不可读,据说这个思路是从代码写得很差的程序员身上学来的。常见的做法有:分离常量、打乱控制流、增加无意义代码、域名锁定、混淆字符串,禁用调试等方法。

  3. 编译

    Node.js代码是通过V8引擎来执行的,而V8引擎会将源代码编译成字节码(bytenode)之后再解释执行。如果我们能将Node.js代码编译成字节码, 将会进一步提高代码的安全性。毕竟反编译V8的字节码并非易事。

  4. 打包

    把Node.js代码和依赖,打包成一个可执行文件。这样可以增加一点破解的难度。

然后从github上抄代码

这里列出几个与js混淆,编译,打包相关的库或网站:

  1. 混淆

    • JavaScript obfuscator-一个强大的JS混淆器。
    • 萨满科技-一套JS代码安全问题解决方案。
  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支持多种混淆技术,可能通过查看文档,按照自己的项目需求,调配选用合适的选项。

nodejs代码保护方式--加密、混淆、编译、打包成exe相关推荐

  1. Python 把脚本编译打包成EXE文件 —— pyinstaller 的安装和使用

    安装 pyinstaller 要把Python脚本编译打包成.exe可执行文件,需要安装 pyinstaller.exe . 打开windows控制台窗口cmd.exe,执行以下命令,Python会自 ...

  2. mybatis-generator-gui如何打包成exe

    快速阅读: ​ 用wix和inno setup把mybatis-generator-gui 打包成exe和安装文件. 以后使用的时候方便,不用每次打开eclipse运行. 使用inno setup 5 ...

  3. python项目成功打包成exe,运行exe时报错:Unhandled exception in script:Failed to excute

    打包 直接运行python代码是正常的,打包成exe后,在运行exe会报错如下: 正常运行代码: 想请问下大神们,为什么运行代码正常,打包完成运行exe就会报错这个? 并且,报错不影响结果的生成.神奇

  4. Jenkins系列:5、wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe

    Jenkins系列:5.wsl下的Jenkins编译Windows下的Qt程序并自动打包成exe 文章目录 Jenkins系列:5.wsl下的Jenkins编译Windows下的Qt程序并自动打包成e ...

  5. Python写的代码打包成.exe可执行文件

    Python写的代码打包成.exe可执行文件 1. 安装pyinstaller 2. [在线生成icon](http://www.ico51.cn/) 3. 打包命令 pyinstaller -i x ...

  6. python 如何将代码打包成exe可执行程序?(导出为exe可执行文件)pyinstaller

    步骤 1 安装pyinstaller pip install pyinstaller 或pip install -i https://pypi.tuna.tsinghua.edu.cn/simple ...

  7. Python代码打包成exe文件

    Python代码打包成exe文件:     安装pyinstaller     打包文件:cmd到文件目录下, 执行 pyinstaller -F test.py 注意:如果有调用的文件或配置文件,打 ...

  8. python3编译成exe运行_python3.x的程序如何打包成exe可执行文件

    最近有人问我,如何将编写的python打包成exe程序.使用pip install pyinstaller,安装了pyinstaller3.3.在网上找了个教程,将程序打包成了exe文件,但是在执行文 ...

  9. Python pycharm环境 飞机大战游戏代码 以及打包成exe教程

    创建项目文件plane war,在项目文件里放入写游戏脚本需要用到的图片文件images以及新建一个新的文件plane放入py文件(main.py和sprites.py) images文件压缩包链接: ...

最新文章

  1. 智能车竞赛研讨会 会议通知
  2. 「云网络」VS「云计算」- vecloud微云服务器
  3. 访问tomcat html,访问云服务器tomcat里html界面
  4. 标记语言 编程语言 脚本语言分别有哪些? 区别是什么?
  5. ubuntu下用vagrant搭建集群环境
  6. Linux下Git免输密码解决方式
  7. Cannot subclass final class class com.sun.proxy.$Proxy16
  8. python异步回调函数的实现
  9. Tomcat Session Clustering
  10. 华为程序员:加了六天班,加班费一万四,网友:我能加到它破产
  11. 实习成长之路:关于ElasticSearch深度分页带来的思考,如何解决深度分页和跳页
  12. Mysql 报错:Unknown collation: ‘utf8mb4_0900_ai_ci‘
  13. 电子元器件/模块供应商汇总
  14. 计算机没鼠标怎么,电脑没鼠标怎么开启系统
  15. happen before
  16. 大数据分析难不难好学吗?
  17. 小日本的恶趣味?育碧让玩家用VR外设闻屁味
  18. redis开启rdb和aof后文件正确恢复
  19. http请求返回405 (Method Not Allowed)
  20. 实验十三:PCF8591模数传感器-数模转换实验

热门文章

  1. 如何定时刷新一个View的内容呢? 酷课堂iOS交流群问答(201901期)
  2. 关于Python的import循环嵌套问题、模块的__name__属性的一些实验结果与心得
  3. opencv中Hu矩的学习心得
  4. 写一个函数来判断一个整数是否为素数
  5. 气象学需要计算机知识吗,应用气象学专业学什么
  6. java计算三角形的外心_hdu 6006(java 大数,三角形的外心)
  7. (一)Redis——五大数据类型及基础知识
  8. push与push_back
  9. RPM包rpmbuild SPEC文件深度说明
  10. 如何用纯CSS将图片填满div,自适应容器大小