首页 > 编程语言 > 在NodeJS中使用npm包实现JS代码混淆加密

在NodeJS中使用npm包实现JS代码混淆加密

时间:2023-10-24 22:05:20浏览次数:38  
标签:npm node NodeJS 54 x65 JS 120 var 92

使用npm包,在NodeJS中实现JS代码混淆加密

在前后端JS开发过程中,JS代码保护(JS代码混淆加密)是非常重要的一环。

JShaman是一个云端的代码保护Saas平台,可以对JS代码进行混淆、加密、压缩等操作,从而增强JS代码的安全性。同时,JShaman还有更方便易用的npm包,方便开发人员通过调用接口的方式,快速完成JS代码混淆加密。

从npm网站,可以找到名为jshaman-javascript-obfuscator的包,如下图所示:

 在NodeJS中使用npm包实现JS代码混淆加密_代码混淆

这里有对它的使用说明,如在Nodejs环境中的安装方法,调用例程,等。

安装

npm install jshaman-javascript-obfuscator

使用

NodeJS例程代码如下所示。

//JShaman JavaScript Obfuscator Web API Interface
var jshaman_javascript_obfuscator = require("jshaman-javascript-obfuscator");

//JavaScript Code to be obfuscated
var javascript_code = `
	function NewObject(prefix)
	{
		var count=0;
		this.SayHello=function(msg)
		{
				count++;
				alert(prefix+msg);
		}
		this.GetCount=function()
		{
				return count;
		}
	}
	var obj=new NewObject("Message : ");
	obj.SayHello("You are welcome.");
`;

//Options. 
//Please refer to the official website of JShaman in English for relevant instructions.
//https://www.jshaman.com/en/
var options = {
    "part_variable_identifier_obfuscate": 1,
	"global_variable_identifier_obfuscate": 0,
	"part_function_identifier_obfuscate":0,
	"global_function_identifier_obfuscate": 0,
	"member_expression_encode": 1,
	"numberic_literal_encode": 1,
	"binary_express_obfuscate": 1,
	"boolean_encode": 1,
	"json_encode":1,
	"regexp_encode":1,
	"string_unicode_encode": 1,
	"assignment_junk_code":1,
	"zombie_code": 1,
	"eval_encode": 1,
	"control_flow": 1,
	"string_reverse": 1,
	"comma_operator": 1,
	"string_array": 0,
	"string_array_encode": 0,
	"vm_execute": 0,
	"ast_execute": 0,
	"no_beautifier": 0,
	"tamper_proof": 0,
	"comments": 0,
	"compress": 1,
	"reserved_word": ["jshaman","w2sfot"]
}

//Secret key,Obtained from the JShaman official website. 
//If not yet obtained, it can be set to free
var secret_key = "free";
var obfuscated_result = jshaman_javascript_obfuscator(javascript_code, options, secret_key);

//Obfuscation result,
//if "state" is 0 it means successful and the "content" is the obfuscated JavaScript code.
//Otherwise,if there is an error,the "message" will contain an error prompt message.
console.log(obfuscated_result.state, obfuscated_result.message, obfuscated_result.content);

代码说明

调用JShaman接口,传入js代码、配置即可,非常简单。

上面的代码中,javascript_code变量是要保护的JS代码,options 变量是参数,参数中各项目的含义,可以参考JShaman官网的说明,值设为1表示启用、设为0表示不启用,secret_key是接口密钥,设为free是免费使用,商业的密钥可以从JShaman官网获得。

加密效果

上面例程中的JS代码,保护后生成的加密JS代码如下所示。

//Obfuscted javascript code
/*
var _0xce7d8a = ["117.", "92.103.98.103.102.126.103.41.72.90.93.41.125.112.121.108.51.", "117.", "117."];

function _0x57d18d(_4, _5) {
  _5 = 9;

  var _,
      _2,
      _3 = "";

  _2 = _4.split(".");

  for (_ = 0; _ < _2.length - 1; _++) {
    _3 += String.fromCharCode(_2[_] ^ _5);
  }

  return _3;
}

var visitors = {
  File(node, scope) {
    ast_excute(node['\x70\x72\x6f\x67\x72\x61\x6d'], scope);
  },

  Program(program, scope) {
    for (i = function () {
      return eval(String.fromCharCode(57, 48, 53, 49, 49, 53, 32, 94, 32, 57, 48, 53, 49, 49, 53));
    }(); eval(String.fromCharCode(105, 32, 60, 32, 112, 114, 111, 103, 114, 97, 109, 91, 39, 92, 120, 54, 50, 92, 120, 54, 102, 92, 120, 54, 52, 92, 120, 55, 57, 39, 93, 91, 39, 92, 120, 54, 99, 92, 120, 54, 53, 92, 120, 54, 101, 92, 120, 54, 55, 92, 120, 55, 52, 92, 120, 54, 56, 39, 93)); eval(String.fromCharCode(105, 43, 43))) {
      ast_excute(program['\x62\x6f\x64\x79'][i], scope);
    }
  },

  ExpressionStatement(node, scope) {
    return ast_excute(node['\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e'], scope);
  },

  CallExpression(node, scope) {
    var func = ast_excute(node['\x63\x61\x6c\x6c\x65\x65'], scope);
    var args = node['\x61\x72\x67\x75\x6d\x65\x6e\x74\x73']['\x6d\x61\x70'](function (arg) {
      return ast_excute(arg, scope);
    });
    var value;

    if (eval(String.fromCharCode(110, 111, 100, 101, 91, 39, 92, 120, 54, 51, 92, 120, 54, 49, 92, 120, 54, 99, 92, 120, 54, 99, 92, 120, 54, 53, 92, 120, 54, 53, 39, 93, 91, 39, 92, 120, 55, 52, 92, 120, 55, 57, 92, 120, 55, 48, 92, 120, 54, 53, 39, 93, 32, 61, 61, 61, 32, 39, 77, 101, 109, 98, 101, 114, 69, 120, 112, 114, 101, 115, 115, 105, 111, 110, 39))) {
      value = ast_excute(node['\x63\x61\x6c\x6c\x65\x65']['\x6f\x62\x6a\x65\x63\x74'], scope);
    }

    return func['\x61\x70\x70\x6c\x79'](value, args);
  },

  MemberExpression(node, scope) {
    var obj = ast_excute(node['\x6f\x62\x6a\x65\x63\x74'], scope);
    var name = node['\x70\x72\x6f\x70\x65\x72\x74\x79']['\x6e\x61\x6d\x65'];
    return obj[name];
  },

  Identifier(node, scope) {
    return scope[node['\x6e\x61\x6d\x65']];
  },

  StringLiteral(node) {
    return node['\x76\x61\x6c\x75\x65'];
  },

  NumericLiteral(node) {
    return node['\x76\x61\x6c\x75\x65'];
  }

};

function ast_excute(node, scope) {
  var _0x51e = "2|1|0".split(_0x57d18d(_0xce7d8a[0])),
      _0x6ebgc = 0;

  while (!![]) {
    switch (+_0x51e[_0x6ebgc++]) {
      case 0:
        return evalute(node, scope);
        continue;

      case 1:
        if (!evalute) {
          throw new Error(_0x57d18d(_0xce7d8a[1]), node['\x74\x79\x70\x65']);
        }

        continue;

      case 2:
        var evalute = visitors[node['\x74\x79\x70\x65']];
        continue;
    }

    break;
  }
}

function _0x2dd6b(prefix) {
  var _0xcf9e = "4|2|0|3|1".split(_0x57d18d(_0xce7d8a[2])),
      _0xef765g = 0;

  while (!![]) {
    switch (+_0xcf9e[_0xef765g++]) {
      case 0:
        _0x38e = function () {
          return eval(String.fromCharCode(56, 54, 57, 53, 54, 52, 32, 94, 32, 56, 54, 57, 53, 53, 54));
        }();

        continue;

      case 1:
        this['\x47\x65\x74\x43\x6f\x75\x6e\x74'] = function () {
          return _0xa1b;
        };

        continue;

      case 2:
        var _0xa1b = function (s, h) {
          return eval(String.fromCharCode(115, 32, 94, 32, 104));
        }(693721, 693721);

        continue;

      case 3:
        this['\x53\x61\x79\x48\x65\x6c\x6c\x6f'] = function (msg) {
          var _0xag624c = "1|0".split(_0x57d18d(_0xce7d8a[3])),
              _0xc1411b = 0;

          while (!![]) {
            switch (+_0xag624c[_0xc1411b++]) {
              case 0:
                alert(eval(String.fromCharCode(112, 114, 101, 102, 105, 120, 32, 43, 32, 109, 115, 103)));
                continue;

              case 1:
                eval(String.fromCharCode(95, 48, 120, 97, 49, 98, 43, 43));
                continue;
            }

            break;
          }
        };

        continue;

      case 4:
        var _0x38e;

        continue;
    }

    break;
  }
}

var _0xecf = new _0x2dd6b(" : egasseM"['\x73\x70\x6c\x69\x74']("")['\x72\x65\x76\x65\x72\x73\x65']()['\x6a\x6f\x69\x6e'](""));

_0xecf['\x53\x61\x79\x48\x65\x6c\x6c\x6f'](".emoclew era uoY"['\x73\x70\x6c\x69\x74']("")['\x72\x65\x76\x65\x72\x73\x65']()['\x6a\x6f\x69\x6e'](""));
*/

做为颇具知名度的JS代码混淆加密平台,JShaman的加密效果还是很不错的。

扩展使用

把上述例程代码稍加改造,嵌入到自己的项目或产品中,就可以进行自动化的JS代码混淆加密了。

混淆加密JS代码、提高JS代码安全性,防止他人随意查看、复制,就是如此简单。

标签:npm,node,NodeJS,54,x65,JS,120,var,92
From: https://blog.51cto.com/jsjiami/8010189

相关文章

  • JS 小数取整的几种方式
    1、Math.ceil()方法:向上取整,不管小数部分是多少,整数部分值都+1Math.ceil(3/2)输出:22、Math.floor()方法:向下取整,不管小数部分是多少,整数部分值都不变,只取整数部分Math.floor(3/2)输出:13、Math.round()方法:四舍五入取整Math.round(3/2)输出:24、parseInt()方法:抛去小数部分,不......
  • Visual Studio code中运行JS代码
    第一步:安装插件: 下面output可以看到输出  2、visualstudiocode中如何创建项目;参考地址:https://blog.csdn.net/weixin_45991687/article/details/123859403?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169814378016800180691969%2522%252C%2522scm%25......
  • js替换模版中${}的内容
    【转】https://blog.csdn.net/xiangzaixiansheng/article/details/132501772要在js中想要替换替换模板中的${},可以使用字符串的replace()方法结合正则表达式或者函数来实现替换操作。以下是两种常见的替换方式:使用正则表达式:方法一:consttemplate="Hello,${name}!Today......
  • php js正则 解决 详情页图片超出问题 匹配img标签内容追加style样式,给富文本中的图片
    做小程序或手机端经常会遇到商品详情,文章详情里带图片的从别的地方复制过来带着样式,导致超出屏幕显示不全的问题php解决functionformat_img($content,$style=''){if(empty($style))$style='max-width:100%;height:auto;';$content=preg_replace("/(\<img)(?!(.*?styl......
  • JS反调试绕过&JS代码混淆&JSFUCK编码
    JS反调试绕过&JS代码混淆&JSFUCK编码如果目标网站的JS代码中有比较机密的东西,会启用反调试,代码混淆这些功能防止泄露机密数据。下面说说几种绕过目标网站JS反调试功能的方法。-禁用断点点击下图那个禁用断点的按钮即可禁止断点过后,大多数情况下可以绕过对方的反调试,但是自己也......
  • pjsip内存优化及提升视频呼叫并发数
      工作上的一个上层调度台应用(Windows7),业务功能上有并发调取多个视频的需求,发现调取30左右路D1视频后会导致崩溃,日志提示:except.c !!!FATAL:unhandledexceptionPJLIB/Nomemory!,内存不足,在开发环境下验证发现内存占用已经达到2G以上(32位程序默认最高给2G内存,通过配置能......
  • list集合,dataTable 转json null转空字符串,时间格式
    usingNewtonsoft.Json;usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceUtils{publicclassNewtonsoftHelper{publicstaticstringToJson<......
  • three.js 深度不完全解读
    three.js深度不完全解读一、深度值的获取1、方法1:FBO的深度附件深度信息通过渲染管线中的深度缓冲区(depthbuffer)来计算和存储。缓冲区用于存储每个像素点的深度值。在渲染过程中,渲染器会根据每个像素点的深度值来确定最终像素的可见性和着色。consttarget=newTHREE.W......
  • pnpm : 无法加载文件
    报错pnpm:无法加载文件C:\Users\16978\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅https:/go.microsoft.com/fwlink/?LinkID=135170中的about_Execution_Policies。 解决办法windows11powershell的安全策略,将nrm命令视为了不安全......
  • js实现在报表参数界面获取body中控件的值
     要在报表参数界面获取body中控件的值,你可以使用JavaScript来实现。下面是一个详细的介绍:1.DOM(文档对象模型):  -DOM是用于操作HTML文档的API,它允许你通过JavaScript访问和操作文档中的元素。  -在报表参数界面,你可以使用DOM来获取页面上的控件元素。2.获取控件元......