把JS代码生成字节码,用字节码技术保护NodeJS源码

开发 前端
现在很后端服务都是用NodeJS开发的,比如网站后台、游戏服务器、应用服务等等。但NodeJS的后端,有一个弊端,常让人心里不踏实:JS的代码,代码是透明公开的,很容易被他人COPY,很容易自己开发产品就泄漏了,甚至是很快出现雷同产品。

 现在很后端服务都是用NodeJS开发的,比如网站后台、游戏服务器、应用服务等等。但NodeJS的后端,有一个弊端,常让人心里不踏实:JS的代码,代码是透明公开的,很容易被他人COPY,很容易自己开发产品就泄漏了,甚至是很快出现雷同产品。

 

[[280724]]

 

这里介绍一种NodeJS源代码保护方式:把nodejs代码转化为字节码,用node启动字节码文件的方式,保护nodejs源代码不泄漏。可应用于nodejs项目提交源码、nodejs产品在不可信的环境中部署,防止别人获取源码。

实现原理

nodejs的内核中对于js的解析,使用的是谷歌的v8引擎。v8引擎内置有js虚拟机。通过v8虚拟机,可以将js代码编译为字节码。而v8虚拟机是能够识别和直接运行该字节码的。因此,以下执行逻辑成为可能:

1、js代码 -> js字节码

2、js字节码 -> nodejs ->运行

实现代码

(例程)

生成字节码文件的部分:

  1. var v8 = require('v8'); 
  2. var fs = require('fs'); 
  3. //读取源文件(JS源码) 
  4. var js_code = fs.readFileSync(__dirname+"/test.js").toString(); 
  5. //生成字节码 
  6. var script = new vm.Script(js_code, {produceCachedData: true}); 
  7. var byte_code = script.cachedData; 
  8. //将字节码写入文件 
  9. fs.writeFileSync(__dirname+"/test.jsb",byte_code); 

读取并运行字节码的部分:

  1. var v8 = require('v8'); 
  2. var fs = require('fs'); 
  3. //从文件中读取字节码 
  4. byte_code = fs.readFileSync(__dirname+"/test.jsb"); 
  5. //运行 
  6. var l = byte_code.slice(8, 12).reduce(function (sum, number, power) { return sum += number * Math.pow(256, power);}); 
  7. var dummyCode =" ".repeat(l); 
  8. script = new vm.Script(dummyCode, {cachedData: byte_code}); 
  9. script.runInThisContext(); 

运行效果

test.js是本例的测试文件,内容如下:

  1. console.log("hello world"); 
  2. console.log("this is a test"); 

运行效果如下:

 

不传之密:把JS代码生成字节码,用字节码技术保护NodeJS源码

 

生成字节码,读取、运行字节码。如此操作起来,并不复杂,如果量大的话,还是稍有些繁琐的。

另外使用JShaman对JS代码进行混淆加密,同样适用于nodejs代码加密,也是个非常不错的nodejs代码保护手段。

注意事项

用这个办法生成机器码,有一点是需要注意的,那就是:平台一致性,比如要在Linux系统中运行,就要在Linux下生成;如果要在Windows平台运行,就得在Windows中生成,否则生成的字节码文件无法正常使用。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2010-03-22 12:40:48

Python代码加密

2011-12-01 14:56:30

Java字节码

2022-03-30 10:10:17

字节码栈空间

2023-01-01 14:04:51

字节码接口系统

2010-09-25 10:20:05

JAVA字节码

2021-12-09 22:36:30

Java 字节码页缓存

2023-08-30 11:03:47

Java工具

2018-04-04 15:05:17

虚拟机字节码引擎

2023-07-03 08:11:48

java字节码字段

2021-05-28 23:04:23

Python利器执行

2011-12-19 10:30:17

Java

2020-04-21 12:09:47

JVM消化字节码

2019-12-20 12:38:28

Java技术工具

2023-02-09 08:24:02

javassist字节码学习

2024-01-30 07:41:20

Java代码操作库

2012-01-12 09:20:49

Java

2023-09-11 19:53:50

2022-01-17 11:28:55

JVM 虚拟机Java

2023-03-27 16:44:23

2012-03-28 10:30:33

ScalaJava
点赞
收藏

51CTO技术栈公众号