前端JavaScript代码混淆加密原理介绍

article/2025/10/3 18:22:10

在这里插入图片描述

因为JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制你的劳动成果,但是由于没有纯粹的加密方案,所以能做的就是让代码变得更加的难以阅读,他人难以复制你的成果,实现“加密”的目的。 在本文中,将为你介绍一些最常见的js代码混淆手段,希望可以帮你更好的理解什么是js代码混淆。当然如果你的代码比较重要,那强烈推荐你试一试 safekodo代码加密工具

首先声明一点,前端的js想做到纯粹的加密目前是不可能的,所有的加密都只能说是混淆,通过一系列的处理使得源码无法阅读,进而达到加密的效果。所以在本文中如果提及了JavaScript代码加密就指代的是混淆。

好的,正文开始~

1. 变量重命名

变量重命名是 JavaScript 代码混淆中最简单且最常用的方法之一。这种方法的基本思想是将所有可能包含敏感信息的变量重命名为无意义的字符串。例如,将 username 替换为 a,将 password 替换为 b。将变量名替换为无意义的字符串或者短字符,使得人类阅读难度大大增加。例如:

// 没有代码混淆
var username = "user123";
var password = "pass456";function login(user, pass) {if (user === username && pass === password) {console.log("Login successful!");} else {console.log("Login failed!");}
}login(username, password);// 使用变量名混淆进行代码混淆
var a = "user123";
var b = "pass456";function c(d, e) {if (d === a && e === b) {console.log("Login successful!");} else {console.log("Login failed!");}
}c(a, b);

但这种只是相当于简化了可读性,实际混淆效果很差,代码占用倒是会变小很多。

2.函数名混淆

函数名混淆是另一种常用的 JavaScript 代码混淆技术。它的基本思想是将所有函数名替换为随机的、无意义的字符串,从而使代码更难被理解和调试。

以下是一个示例:

// 没有代码混淆
function add(x, y) {return x + y;
}console.log(add(2, 3));// 使用函数名混淆进行代码混淆
var a = function(b, c) {return b + c;
}console.log(a(2, 3));

这种本质还是和上面介绍的变量重命名一样。

3. 压缩代码

压缩是另一种常见的JavaScript代码混淆技术。通过使用各种压缩算法,可以将JavaScript代码文件缩小到原始大小的一半以下。同时也使用了上面介绍的变量名或者函数名混淆(下方示例的压缩后的代码并未对函数名进行压缩)例如:

function calculateSum(num1, num2) {var sum = num1 + num2;return sum;
}var result = calculateSum(3, 4);
console.log(result);

可以通过压缩代码将其变为以下形式:

function calculateSum(a,b){return a+b}console.log(calculateSum(3,4));

虽然这样的代码难以阅读,但对于需要快速加载和运行的Web应用程序来说非常有用。

4. 字符串编码

//文本编码为base64
const text = "Hello, world!";
const base64 = btoa(text);
console.log(base64); // 输出 "SGVsbG8sIHdvcmxkIQ=="
//base64解码为文本
const base64 = "SGVsbG8sIHdvcmxkIQ==";
const text = atob(base64);
console.log(text); // 输出 "Hello, world!"

将字符串进行编码,不易被人读取。例如,将"Hello, world!“转换为"SGVsbG8sIHdvcmxkIQ==”。解密时使用base64解码即可。

除了base64还可以使用十六进制码的形式表示了字符串中各个字符的 ASCII 码值
具体来说,\x 是一个转义序列,后面跟随两个十六进制数字,表示一个 ASCII 码值。因此,\x48 表示的是字符 “H” 的 ASCII 码值,\x65 表示的是字符 “e” 的 ASCII 码值,依次类推。
例如:
可以将代码

var message = "Hello World!";
alert(message);

使用十六进制码的形式表示了字符串中各个字符的 ASCII 码值

var _0x3d9d=["\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"];alert(_0x3d9d[0]);

将这些 ASCII 码值拼接起来,可以得到完整的字符串 “Hello World!”。

在这里插入图片描述

4. 代码打乱

JS 控制流混淆是一种消除JavaScript代码的可预测性的技术,通过使用控制流混淆算法(如JScrambler),改变程序结构来防止代码被轻易地理解和分析的技术。简单来说,就是通过修改代码中的控制流语句(如 if、while 等)的顺序、嵌套、去除等方式来增加代码的复杂性,从而使得代码难以被反编译、破解或者逆向工程攻击。以下是一个简短的示例:

const a = 1;
const b = 2;
let c = 0;
if (a === 1) {if (b === 2) {c = 3;}
} else {c = 4;
}

这段代码可以通过控制流混淆的方式进行优化。例如,可以将 if 块内部的语句交错、嵌套,增加运算符的数量,达到混淆的效果:

const a = 1;
const b = 2;
let c = 0;
if (!(a !== 1)) {if (!(![])) c = 3;
} else {if (!(!{})) c = 4;
}

可以看到,经过混淆之后的代码,不仅代码结构产生了较大的变化,同时还加入了无用的计算和类型转换等操作,使得代码更深奥难懂。

5.方法实现

当需要保护JavaScript代码的时候,常见的方式是进行混淆。通过混淆,可以使代码难以被阅读和修改,从而保护代码的安全性。在本文中下半部分,我们将介绍如何使用AST语法树来进行JavaScript代码混淆。

什么是AST语法树?

AST(Abstract Syntax Tree)语法树是将代码转换为树形结构的一种方式。它能够表示出代码的结构和语义,可以被用于代码分析、优化和转换。AST语法树通常由编译器或解释器生成,用于在代码执行之前对其进行处理。

在JavaScript中,AST语法树可以使用工具库如Esprima或Babel来生成。这些库将JavaScript代码解析为AST语法树,并提供了简单易用的API来让开发者进行代码分析和操作。

使用AST语法树进行JavaScript代码混淆

AST语法树提供了一种强大的工具来进行JavaScript代码混淆。通过对AST语法树进行操作,我们可以改变代码的结构和语义,使其变得更加难以理解和修改。
esprima、babel都可以实现
下面是一些常见的AST语法树操作:

// 变量重命名示例
const esprima = require('esprima');
const estraverse = require('estraverse');const code = `function add(a, b) {let c = a + b;return c;}
`;const ast = esprima.parseScript(code);const varMap = {'a': 'x','b': 'y','c': 'z'
};estraverse.replace(ast, {enter(node) {if (node.type === 'Identifier' && varMap[node.name]) {node.name = varMap[node.name];}}
});const newCode = escodegen.generate(ast);console.log(newCode);
// 将加号替换成减号
const code = `const sum = (a, b) => a + b;const result = sum(1, 2);
`;const ast = esprima.parseScript(code);
const newAst = replaceCode(ast, "+", "-");console.log(generate(newAst));
//babel实现将代码中的所有值为false的节点并替换为![]
const parser = require("@babel/parser");
const traverse = require("@babel/traverse").default;
const generator = require("@babel/generator").default;// 原始代码
const code = `let flag = false;
if (flag) {console.log("Flag is true");
} else {console.log("Flag is false");
}`;const ast = parser.parse(code);traverse(ast, {enter(path) {if (path.isBooleanLiteral({ value: false })) {path.replaceWith(parser.parse("![]").program.body[0].expression);}}
});// 将AST语法树重新生成为代码字符串
const newCode = generator(ast).code;// 输出新代码
console.log(newCode);// 新代码为:
// let flag = ![];
// if (flag) {
//   console.log("Flag is true");
// } else {
//   console.log("Flag is ![]");
// }

篇幅有限,对于babel将js代码解析为ast语法树这一部分后续在进行着重介绍。

温馨提示

如果您对AST语法树的结构不是很了解的话,推荐您前往safekodo官网使用在线的js=>ast语法树工具,在网站中的编辑器输入JavaScript代码即可在右侧看到响应的AST语法树结构,当然相应的还有ast=>js工具,非常的直观

在这里插入图片描述在这里插入图片描述

需要注意的是,JavaScript 代码混淆并不能完全保证代码的安全性,因为熟练的开发人员仍然可以通过不同的手段逆向工程出原始代码。因此,除了代码混淆之外,我们还应该采取其他措施来保护我们的 JavaScript 代码,例如加密算法和访问控制等。

以上介绍的都是一些常用的简单的JavaScript代码混淆原理,如果你想更加简单粗暴的保护你的源代码,可以使用safekodo代码加密工具进行一步到位的代码保护。safekodo支持多平台的js代码保护(web端、nodejs、electron、小程序、APP等 ),同时还支持众多配置(代码高度混淆、数据多重加密、控制流扁平化处理、死代码块注入、运行环境及时间可锁定等等功能及方案 )

在这里插入图片描述
在这里插入图片描述

5. 总结

在本文中我们了解了什么是JavaScript代码混淆加密,以及通过一些代码示例明白其原理,在后面的文章中还会介绍在node/electron中使用bytenode将JavaScript代码编译为jsc字节码实现代码加密的效果以及一些注意事项。喜欢的话就点个关注吧


http://chatgpt.dhexx.cn/article/nMf3VeIF.shtml

相关文章

JS常见加密混淆一览

参考文章: https://www.cnblogs.com/guyouyin123/p/13804700.html 常见js混淆加密 JSFUCKAAEncodeJJEncode JSFUCK 特征为由[]{}()!组成的看不懂的代码 AAEncode 俗称aa混淆,特征为网络表情符号 JJEncode jj混淆,特点是特别多的$混淆 虽然…

JS常见加密混淆方式

目录 前端js常见混淆加密保护方式 eval方法等字符串参数emscriptenWebAssemblyjs混淆实现 JSFuckAAEncodeJJEncode代码压缩变量名混淆字符串混淆自我保护,比如卡死浏览器控制流平坦化僵尸代码注入对象键名替换禁用控制台输出调试保护,比如无限Debug,定时…

JS逆向之常见编码和混淆加密方式(一)

一般情况下,js的代码加密用来加密混淆代码,降低代码的可读性,如果一段没有经过任何加密混淆的代码,很容易被第三方或者脚本破解利用,引发许多的安全问题,本文将从以下多个角度讲解,代码加密的一…

最常用的js混淆加密解

JS混淆加密是一种用于保护JS代码的技术,它能够将代码变得难以理解和修改,从而提高代码的安全性。但是,当我们需要修改和维护这些代码时,我们就会面临困难。因此,在某些情况下,我们需要解这些JS代码。 下面…

PS操作小技巧

PS操作小技巧 如何查看psd文件指定图层图片的大小? 如何查看psd文件指定图层图片的大小? 首先你需要找到你的指定图层:点击小眼睛 然后再配合使用**Ctrl 左键 ** 这个时候图片会被选中,效果如下:

PS的简单操作!

PS的简单操作! ctrld:取消选择区域的线、 ctrlr:标尺线、 ctrlaltz:返回最初步骤、 ctrlz:返回上一步、 注:在有交叉线处,按alt键可以拖出以“交叉点”为中心的“矩形”或者“椭圆”如果想使矩形变正方形,椭圆变圆形则altshift键。…

PhotoShop 基本操作介绍, 附带图文解说

一篇适合小白学习的教程,主要介绍PS的界面和基本操作,及分享一些常用的快捷键。 首次打开PS首先需要修改PS内的预设值 ①打开常规面板(也可以在菜单栏里打开,windows电脑在“文件菜单”下点击“常规”快捷键ctrl+k) <点图片看大图>www.16xx8.com 性能一般设为70%,…

简单的ps

1、快捷键 command n 创建文档 f7 图层 M 选框工具 v 移动工具 Command j 提取图层 shift f5 填充颜色 Ctrl t 自由变换尺寸 Ctrl 选中多个图层一起移动 Shift 选中多个图层可以选择连接 Alt 可以单看蒙版 ctrl d 取消选择 ctrl i 反选 2、注意事项 1、蒙版…

PS(一)PS基础从0开始,感兴趣的可以来看看

目录 一、PS基础知识和操作 2、调整页面 界面是不是太繁琐了 在右上角有个小列表&#xff08;我已经给大家标出来了&#xff09;点开有个关闭选项卡组&#xff0c;点击一下界面就会简洁了 ​编辑 有的界面打开少了什么工具啊可以点击窗口-工作区-复位基本功能 3、认识基本的位…

PS~了解PS的第一步,基本操作

1、PS如何新建画布 ①选择文件—新建—修改参数—确定 ②CtrlN 新建的快捷键—修改参数—确定 名称&#xff1a;自己修改宽高&#xff1a;自己修改&#xff0c;我们通常使用像素来定义分辨率&#xff1a;72颜色模式&#xff1a;RGB背景&#xff1a;自己选择白色或者透明 2、在…

PS_01_基本操作

贺叶铭_PS公开课_笔记 ctrl shift u :去掉颜色,去色 ctrl i 直接填充该选区的颜色的补色 例如&#xff1a; 第一天&#xff1a; 界面构成 1 菜单栏 2 工具箱 3 工具属性栏 4 悬浮面板 5 画布 ctrl N 新建对话框&#xff08;针对画布进行设置&#xff09; 如果只说数…

PS基本操作介绍与下载

文章目录 学习视频教程pj版PS下载 以及 视频教程相关素材链接Photoshop基本使用PS界面组成&#xff1a;图层操作(重点)图层编组图层上下位置移动Photoshop 切图切片工具辅助线和切片使用及清除切图插件 学习视频教程 http://2565.replace.favo.tyouai.com/ pj版PS下载 以及 视…

photoShop日常操作教程、PS

目录 提亮 改背景色 替换颜色 智能抠图并更换背景色 提亮 打开或者拖入一张照片复制原图片&#xff1a;CommandJ&#xff08;MacOS上的快捷键&#xff0c;Windows是CtrlJ&#xff09;提取高亮&#xff1a;Commandalt2&#xff08;MacOS上的快捷键&#xff0c;Windows是Ctrla…

PS基础操作及常用快捷键

文章目录 1. PS界面2. PS基础操作3. 图层4. 填充颜色5. 选框工具6. 自由变化 ctrlT7. 常用快捷键 1. PS界面 窗口菜单&#xff1a;管理&#xff08;显示/隐藏&#xff09;工具栏、属性栏、面板 将ps界面恢复到初始状态&#xff1a;窗口——工作区——复位基本功能自定义窗口设…

PS-简单操作工具介绍

PS有历史记录&#xff0c;可以返回之前的操作 图像的放大缩小可以使用&#xff1a;Ctrl &#xff0c;ctrl - 选中图层后&#xff0c;按住“alt”&#xff0c;用鼠标拖动可以实现图层复制 目录 调整输出图像的尺寸 多图拼接 3D模式 选区工具 裁减工具 套索工具 钢笔工…

PS知识点大总结(一)——基础操作

PS的界面&#xff1a; 菜单栏、属性栏、工具栏、编辑区、活动面板 PS的功能&#xff1a; 图像处理&#xff08;影楼后期、人像修复美化&#xff09;&#xff1b;排版&#xff08;书籍、杂志、喷绘、广告&#xff09;&#xff1b;网页、APP版面设计。 PS版本&#xff…

PS基础概念和操作

PS基础概念和操作 1、基础概念(1) 色彩空间RGB --> HSB/HSVRGB --> HSL (2) 相邻色和互补色(3) 混合模式 2、基础操作&#xff08;1&#xff09;选区、通道和蒙版的相互转换&#xff08;2&#xff09;HSL面板调色 3、基础功能&#xff08;1&#xff09;皮肤美白调色&…

Photoshop(PS)基础操作

♥️作者&#xff1a;奇妙的大歪 ♥️个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01; ♥️个人简介&#xff1a;云计算网络运维专业人员 目录 &#xff08;一&#xff09;ps的基础操作 &#xff08;二&#xff09;画布操作 &#xff08;三&#xff09;图层基…

C语言文件操作(含代码+例题)

为什么使用文件&#xff1f; 使用文件可以将数据直接存放在电脑的硬盘上&#xff0c;做到数据的持久化。 一般来说&#xff0c;做到数据持久化的方法有把数据放在磁盘文件、存放到数据库等方式。 什么是文件&#xff1f; 文件的分类 磁盘上显示的文件就是文件。一般有数据文件和…

Android修改项目包名

一 Android Studio 修改过程 修改项目包名&#xff0c;实现不覆盖安装(如果只是想不覆盖安装&#xff0c;更改build.gradle里面的包名就OK了&#xff0c;那这篇博文到这里就可以结束了&#xff0c;如果希望项目层次的包名也更改的话&#xff0c;请往下看) 1.首先新建一个项目&…