专栏首页工作专用1JS生成字节码生成技术,用字节码保护商业NodeJS源码!
原创

JS生成字节码生成技术,用字节码保护商业NodeJS源码!

本文介绍一种NodeJS源代码保护方式:通过把nodejs代码转化为字节码,用node启动字节码文件的方式,保护nodejs源代码不泄漏。

可应用于nodejs项目提交源码、nodejs产品在不可信的环境中部署,防止别人获取源码。 如同JS代码一样,nodejs源码,也是透明代码,通常用node启动代码时,都必须把源码也放置到启动环境中。这在很多时候是不安全不稳妥的。因为js源码透明的原因,别人可以直接获取到产品或项目源码。 如果是为第三方定制项目,对方可以直接拿到源码。如果是要在某些环境中启动项目,比如虚拟主机、他人的服务器中,源码的也是很令人担心的。 为了防止源码泄漏带来的一系列令人不安的后果,这里介绍一种专门针对于nodejs源码的保护技术:将nodejs代码转化为字节码文件。

实现原理

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

实现代码

(例程)

生成字节码文件的部分:

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

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

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

运行效果

test.js是本例的测试文件,内容如下: console.log("hello world"); console.log("this is a test"); 运行效果如下:

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

另外一个弊端是:兼容性问题。比如win下生成的字节码,到linux下,是不能正常运行的。如果要在linux下用,就要在linux下生成。也就是操作系统要一致。

对于JS代码产品的保护,除了可以使用字节码技术,还可以用代码混淆加密的办法,比如:JShaman(http://www.jshaman.com/)是一款对JS代码进行混淆加密的工具,也适用于nodejs代码加密,也是个非常不错的nodejs代码保护手段,且可对前端JS代码进行保护,通用性比较强。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么采用HTTPS是如此重要

    随着越来越多的数据泄露事件被披露,网络安全和隐私问题成为信息安全的雷区。从而迫使越来越多人放弃标准的HTTPS协议,使用更安全的HTTPS安全加密协议。

    迅达集团
  • 你有一份Redis运维秘籍,请查收!

    先给大家讲一个基本知识点:数据库分类大致分为两类,关系型数据库和非关系型数据库。如果详细区分的话,还可以继续分下去。

    迅达集团
  • 服务器排障 之 nginx 499 错误的解决

    An Nginx HTTP server extension. This codeis introduced to log the case when the...

    迅达集团
  • 动态加载 ExtJS 类库

    ExtJS 是一个非常优秀的 JS 框架, 由于 ExtJS 自身非常庞大, 用于开发测试的 ext-all-debug.js 文件达到了 3.24M , 如果...

    beginor
  • Vista Ultimate在ADSL连接下部分网站无法访问的问题解决

    本本从Vista Home Basic升级到了Vista Ultimate,并且更新了SP1,之后突然发现新浪、网易、搜狐等门户都上不去,刚开始怀疑是ADSL的...

    大江小浪
  • Java IO详解那点事

    FileInputStream:字节文件输入流,从文件系统中的某个文件中获得输入字节,用于读取诸如图像数据之类的原始字节流。

    java乐园
  • 171 Excel Sheet Column Number

    /** * 题意:A表示1 B表示2 AA表示27 AB表示28 ------>给你一串字符串输出相应的数字 * 分析:这个就类似于二进制转十进制,从...

    用户1624346
  • IP 基础知识“全家桶”,45 张图一套带走

    前段时间,有读者希望我写一篇关于 IP 分类地址、子网划分等的文章,他反馈常常混淆,摸不着头脑。

    lucifer210
  • IP 基础知识“全家桶”,45 张图一套带走

    前段时间,有读者希望我写一篇关于 IP 分类地址、子网划分等的文章,他反馈常常混淆,摸不着头脑。

    小林coding
  • IP 基础知识“全家桶”,45 张图一套带走

    前段时间,有读者希望我写一篇关于 IP 分类地址、子网划分等的文章,他反馈常常混淆,摸不着头脑。

    黄泽杰

扫码关注云+社区

领取腾讯云代金券