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

news2024/10/2 12:29:12

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

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

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

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

这里有对它的使用说明,如在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代码安全性,防止他人随意查看、复制,就是如此简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[极客大挑战 2019]EasySQL

【解题思路】 1.打开靶机链接 2.输入数据进行尝试 输入1,1&#xff1a; 可以在导航栏里面看到username和password的变量。 3.使用万能密码 username&#xff1a;1 or 11# username&#xff1a;任意数据 password&#xff1a;任意数据 …

传统制造业如何转型?什么是智能工厂?

本文将为大家讲解&#xff1a;传统制造业如何转型&#xff1f;什么是智能工厂&#xff1f; 一、传统工业存在哪些痛点 相较于新兴工业&#xff0c;传统工业在当前发展放缓&#xff0c;并受到了一波互联网数字化智能化发展的冲击。 1、低效率和高成本 传统工业通常采用传统的…

C算法:写一个用于找出数组的最大值和最小值的函数

需求&#xff1a; 写一个用于找出数组的最大值和最小值的函数。 示例&#xff1a;int array[9] {5, 9, 3, 1, 2, 8, 4, 7, 6}; 该数组最大值的下标为1&#xff0c;最小值的小标为3。 代码实现&#xff1a; #include <stdio.h>int getNum(int *array,int len,int (*…

【JAVA学习笔记】39 - final关键字

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_ 一、final关键字基本介绍 final可以修饰类、属性、方法和局部变量&#xff0c; 在某些情况下&#xff0c;程序员可能有以下需求&#xff0c;就会使用到final 1)当…

C算法:米m 转化 英尺foot和英寸inch

需求&#xff1a; 已知1英尺等于12英寸&#xff0c;如果已知英制长度的英尺foot和英寸inch的值&#xff0c;那么对应的米是(footinch/12)*0.3048&#xff0c;现在&#xff0c;用户输入的是厘米数&#xff0c;那么对应英制长度的英尺和英寸是多少呢? 输入样例&#xff1a; 1…

ITSource 分享 第4期【简洁的问卷调查系统】

项目介绍 本期给大家介绍一个 简洁的问卷的调查系统。 一 业务介绍 本系统分为以下几个模块: 1.登录注册 2.新建问卷 注册登录完成后,即可进入首页 可以创建问卷 目前只有单选&#xff0c;多选&#xff0c;简答三种问题类型&#xff0c;并且可以选择手动结束和自动结束模式。…

【强化学习】07——规划与学习(Dyna-Q)

文章目录 前置知识回顾策略值函数估计&#xff08;Policy Evaluation&#xff09;策略提升&#xff08;Policy Improvement&#xff09; 模型&#xff08;Model&#xff09;规划(Planning)规划与学习(Planning and Learning)Dyna (集成规划、决策和学习&#xff09;Dyna的框架D…

企业使用微信管理系统更安全更高效更智能

. 想快速处理纠纷&#xff0c;不知道员工和客户孰对孰错&#xff1f; 想提高客户满意度&#xff0c;不清楚客服沟通全过程&#xff1f; 想维护公司利益&#xff0c;不了解销售聊了哪些事&#xff1f; 想知道客户流失原因&#xff0c;不确定沟通话术是否专业&#xff1f; …

第56篇-某度旋转验证码v1分析-旋转验证码【2023-10-24】

声明&#xff1a;该专栏涉及的所有案例均为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;如有侵权&#xff0c;请私信联系本人删帖&#xff01; 一、网站分析 网址&#xff1a; aHR0cHM6Ly93YXBwYXNzLmJhaWR1Lm…

栈和队列相关的OJ题

1.栈的压入、弹出序列 题目链接 栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com) 题目描述 题目给出两个序列&#xff0c;一个是入序列pushV&#xff0c;一个是出序列popV&#xff0c;要求判断是否匹配入栈出栈的规则顺序。 解题思路 可以用数据模拟入栈出栈&#xf…

基于樽海鞘群算法的无人机航迹规划-附代码

基于樽海鞘群算法的无人机航迹规划 文章目录 基于樽海鞘群算法的无人机航迹规划1.樽海鞘群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用樽海鞘群算法来优化无人机航迹规划。 …

一文讲清楚检索增强生成(RAG)

文章目录 什么是检索增强生成&#xff1f;逆向工作&#xff1a;为大语言模型提供额外的知识来回答问题通过系统提示给出LLM自定义指令为LLM提供特定的知识来源将所有内容放在一起并提出问题检索步骤&#xff1a;从您的知识库中获取正确的信息什么是嵌入&#xff1f;它们与知识检…

【第四天]C++高级类和对象:运算符重载、string类和智能指针的深度解析

一、运算符重载 运算符重载 是对已有的运算符 指定新功能&#xff0c;不能创建新运算符。 运算符重载关键字operator 语法&#xff1a;operator &#xff08;表示被重载的运算符&#xff09; 思路&#xff1a; 1、弄懂 函数的参数中参数个数取决于运算符是一元还是二元…

如何高效地给视频批量添加logo水印?

如果你想给大量的视频添加图片水印&#xff0c;那么固乔剪辑助手软件是一个非常不错的选择。通过这个软件&#xff0c;你可以轻松地批量添加图片水印&#xff0c;提高视频的质量和识别度。以下是如何使用固乔剪辑助手软件给视频批量添加图片水印的步骤&#xff1a; 步骤1&#…

Qt+树莓派4B 窗口半透明效果实现

文章目录 前言一、窗口半透明&#xff0c;窗口部件不透明1、构造函数中的设置2、paintEvent3、效果4、树莓派4B配置5、最终效果 前言 在树莓派4B下&#xff0c;使用Qt开发窗口半透明而窗口部件不透明效果时,发现窗口没能正常实现半透明效果,而是显示纯黑色背景。同样的代码在wi…

PLC 学习day03 PLC软件安装 PLC软件的介绍和对应的知识

1.资料来源 链接&#xff1a;7.PLC编程学习入门视频教程全集-三菱GX-Works2编程软件安装_哔哩哔哩_bilibili 链接&#xff1a;8.三菱plc视频教程全集之编程语言及软元件介绍_哔哩哔哩_bilibili 2. PLC软件的安装 三菱的PLC软件安装视屏的链接&#xff1a; 7.PLC编程学习入门视频…

Gymnasium的基本用法

目录 1.初始化环境 2.与环境交互 3.动作和观测空间 4.修改环境 Gymnasium是一个为所有单智能体强化学习环境提供API的项目&#xff0c;包括常见环境的实现:cartpole、pendulum、mountain-car、mujoco、atari等。 该API包含四个关键功能:make、reset、step和render&#xf…

对称加密操作

#常用密码技术 ##1 密码 1.1 发送者、接收者和窃听者 请想象一个Alice向Bob发送电子邮件的场景。在这个场景中&#xff0c;发出邮件的Alice称为 发送者&#xff08;sender&#xff09;&#xff0c;而收到邮件的Bob则称为 接收者&#xff08;receiver&#xff09;。 在讲解发送…

公司只有功能测试,如何进一步提升自己?

一定要帮助想上进却又迷茫的人。 最近也听到一些做功能测试的同学的交流&#xff0c;天天做手工测试&#xff0c;想提升一下自己又不知道如何提升&#xff1f;其实还是在于这些同学对自己没有一个清晰的定位&#xff0c;没有明确的目标。做为功能测试人员来讲&#xff0c;从发…

【OpenVINO】基于 OpenVINO Python API 部署 RT-DETR 模型

基于 OpenVINO Python API 部署 RT-DETR 模型 1. RT-DETR2. OpenVINO3. 环境配置3.1 模型下载环境3.2 模型部署环境 4. 模型下载与转换4.1 PaddlePaddle模型下载4.2 IR模型转换 5. Python代码实现5.1 模型推理流程实现 6. 预测结果展示7. 总结 RT-DETR是在DETR模型基础上进行改…