工具哇!

JavaScript 混淆加密

完全免费的在线 JavaScript 混淆加密工具,无任何功能限制,强力保护你的代码不被窃取!

  • 原始代码
  • 加密输出
基本设置

标识符设置
高级设置


字符串设置




使用说明

基本设置

压缩成一行 compact

去除代码中的换行符,将代码压缩成一行。

精简代码 simplify

通过简化代码增强混淆效果。

点击查看示例
// 原始代码
if (condition1) {
    const foo = 1;
    const bar = 2;

    console.log(foo);

    return bar;
} else if (condition2) {
    console.log(1);
    console.log(2);
    console.log(3);

    return 4;
} else {
    return 5;
}

// 精简后
if (condition1) {
    const foo = 0x1, bar = 0x2;
    return console['log'](foo), bar;
} else
    return condition2 ? (console['log'](0x1), console['log'](0x2), console['log'](0x3), 0x4) : 0x5;

字符串转 Unicode unicodeEscapeSequence

用于将字符串中的字符转换为Unicode转义形式(如 "a""\u0061"),使代码中的字符串失去可读性的同时保持功能不变,无性能损耗,但会增加加密后的代码长度。

点击查看示例
// 原始代码  
const str = "hello";  

// 启用后  
const str = "\u0068\u0065\u006c\u006c\u006f"; // "hello"  

数字转表达式 numbersToExpressions

将代码中的数字字面量(如 42)转换为等效的复杂表达式(如 (40 + 2) 或 (6 * 7)),增加逆向分析时理解数值含义的难度。

点击查看示例
// 输入
const foo = 1234;

// 转换后
const foo=-0xd93+-0x10b4+0x41*0x67+0x84e*0x3+-0xff8;

自我防御 selfDefending

该参数会为混淆后的代码注入自校验逻辑,当检测到代码被格式化、调试或非法修改时,自动触发异常或死循环,使代码无法正常运行,从而阻止逆向工程分析。

⚠开启此选项后,不要对加密后的代码做改动,任何对加密后代码的改动都会触发防御机制,使代码无法正常运行!

禁用控制台输出 disableConsoleOutput

通过把 console.log, console.info, console.error, console.warn, console.debug, console.exception 以及 console.trace 函数重写为空值,实现禁用控制台调试输出,加大解密调试难度。

控制流平坦化 controlFlowFlattening

该参数通过将代码中的逻辑分支(如 if/elseswitch)拆解为扁平化的状态机结构,打乱原有执行流程的线性可读性,使逆向分析者难以直接理解程序的实际逻辑路径。

可能轻微增加运行时开销(取决于代码复杂度)。

点击查看示例
// 原始逻辑  
if (a) { func1(); } else { func2(); }  

// 扁平化后(伪代码)  
switch (_0xstate) {  
    case 0: if (a) _0xstate = 1; else _0xstate = 2; break;  
    case 1: func1(); break;  
    case 2: func2(); break;  
}  

控制流平坦化阈值 controlFlowFlatteningThreshold

设定触发控制流平坦化的最小概率阈值(范围:01),例如:设置为 0.75 时 75% 的代码块会被平坦化。

注:阈值设置为 0 时,相当于关闭控制流平坦化。

死代码注入 deadCodeInjection

启用后会在代码中随机插入无效但语法正确的逻辑片段(如永不执行的条件分支、无意义的运算),干扰逆向分析者对核心代码的定位,同时不改变程序原有功能。因为死代码实际不会被执行,因此无运行时性能损耗。

点击查看示例
// 原始代码  
function add(a, b) { return a + b; }  

// 注入死代码后  
function add(a, b) {  
    if (false) { console.log("干扰内容"); }  
    return a + b;  
}  

防F12调试保护 debugProtection

启用后会注入反调试代码,当检测到开发者工具(如 Chrome DevTools)被打开时,强制触发无限循环、崩溃或阻塞脚本执行,从而阻止通过调试工具动态分析代码逻辑。

调试保护检测间隔 debugProtectionInterval

用于设定反调试检测的轮询频率(单位:毫秒),控制防F12调试保护功能检查开发者工具是否打开的间隔时间。

间隔越短,防护越灵敏,但可能增加性能开销;反之则降低检测强度。

域名锁定 domainLock

用于将混淆后的代码绑定到指定域名,当检测到运行环境与预设域名不匹配时,代码会自动失效或触发异常,防止代码被非法盗用或跨域执行。

核心特性:

  1. 访问控制:仅允许在设定的域名(如 example.com)下正常运行,否则抛出错误。
  2. 防复制保护:适用于商业项目,避免代码被移植到其他站点滥用。
  3. 轻量级实现:通过简单的域名校验逻辑,几乎无性能开销。

注意:需谨慎设置,避免因域名变更导致自身业务异常。该选项在 node 环境中无效。

要使其在包括任何子域(example.comsub.example.com)在内的根域上工作,请使用 .example.com

域名锁定跳转链接 domainLockRedirectUrl

该参数用于配合域名锁定,当代码在非法域名下运行时,可以强制跳转到指定URL(如错误页面或授权页)。

标识符设置

标识符加密方式 identifierNamesGenerator

用于控制混淆后代码中变量名、函数名等标识符的生成规则,通过替换原始名称(如 userToken)为无意义的随机字符串(如 _0x1a2b),大幅降低代码可读性。

可选值及效果:

  • 十六进制标识符(默认):生成十六进制短标识符(如 _0xabc123)。
  • 短标识符:生成极短的无意义字符(如 ab),最小化代码体积。
  • 短标识符(打乱顺序):同短标识符,只是顺序会被打乱。
  • 标识符字典:使用标识符字典里设置的标识符。
点击查看示例
// 原始代码  
function getUserData() { ... }  

// 混淆后(十六进制标识符 模式)  
function _0x12d4f() { ... }  

标识符字典 identifiersDictionary

设置哦标识符加密的预设词库。仅标识符加密方式选择“标识符字典”时有效。

标识符前缀 identifiersPrefix

用于为混淆后的变量名、函数名等标识符统一添加自定义前缀,使混淆后的代码风格更统一,同时在需要加密多份 js 时,可以为每个 js 指定不同的前缀,避免生成的标识符冲突。

例如设为 toolwa_ 时,所有标识符会变为 toolwa_atoolwa_b 等形式。

白名单标识符名称 reservedNames

加入白名单后,白名单内的标识符和属性名不会进行混淆,支持正则表达式,如:

^someVariable
functionParameter_\d

高级设置

运行环境 target

设置加密后的代码在哪里运行,根据运行环境,加密方式会有针对性的改动。

随机种子 seed

此选项为随机生成器设置种子。用于生成可重复的加密结果。设置为 0 则使用随机的随机种子。

忽略 Imports ignoreImports

防止混淆 Imports。在某些情况下,当运行时环境出于某种原因只需要使用静态字符串进行这些导入时,可以开启该选项。

重命名全局变量 renameGlobals

设置是否混淆代码中的全局变量和函数名。默认跳过浏览器内置 API(如 document、fetch)以避免运行时错误。

加密对象键名 transformObjectKeys

用于深度混淆对象的键名(如将 { key: value } 转换为 { _0x1a2b: value }),适用于 JSON 数据、配置对象或类实例属性,防止通过键名直接推断数据结构含义。

点击查看示例
// 原始代码  
const config = { apiUrl: "https://toolwa.com", auth: { token: "xyz" } };  

// 混淆后
const config = { _0x12ab: "https://toolwa.com", _0x34cd: { _0x56ef: "xyz" } };  

注意:

  • 若代码依赖动态键名(如 obj[key]),需通过 reservedNames 保留这些键,否则可能导致功能异常。
  • 会轻微增加代码体积,建议只对高敏感数据结构启用。

重命名属性 renameProperties

⚠️启用该选项可能导致代码无法正常运行!一般不建议启用。

重命名属性名称。但所有内置 DOM 属性和核心 JavaScript 类中的属性会被忽略。

点击查看示例
// 原始代码
(function () {
    const foo = {
        prop1: 1,
        prop2: 2,
        calc: function () {
            return this.prop1 + this.prop2;
        }
    };

    console.log(foo.calc());
})();

// 混淆后
(function () {
    const _0x46529b = {
        '_0x10cec7': 0x1,
        '_0xc1c0ca': 0x2,
        '_0x4b961d': function () {
            return this['_0x10cec7'] + this['_0xc1c0ca'];
        }
    };
    console['log'](_0x46529b['_0x4b961d']());
}());

重命名属性模式 renamePropertiesMode

  • 相对安全的模式:尝试以更安全的方式重命名属性以防止运行时错误。使用此模式,某些属性将被排除在重命名之外,但不是 100% 安全。
  • 不安全模式:以不安全的方式重命名属性,不受任何限制。

字符串设置

字符串分割 splitStrings

用于将代码中的长字符串拆分为多个片段,再通过拼接方式(如数组索引或运算)动态还原,干扰字符串的静态分析,同时避免直接暴露完整敏感信息(如密钥、URL)。

点击查看示例
// 原始代码  
const apiUrl = "https://api.toolwa.com/v1";   

// 混淆后
const _0x12ab = ["ht", "tps:/", "/api.", "toolwa", ".com/", "v1"];  
const apiUrl = _0x12ab.join("");   

字符串分割长度 splitStringsChunkLength

设置字符串被分割后,每一部分的长度,长度越小,字符串被分割得越碎,但会增加代码体积。

字符串转换为数组 stringArray

去除代码中固定的字符串文本,并将其统一放在一个数组中。例如 var m = "Hello World"; 中的 "Hello World",将会被替换为一个函数调用,在运行时再获取到值。例如:var m = _0xb0c3('0x1');

字符串转数组阈值 stringArrayThreshold

调整将字符串文字插入到字符串数组中的概率(从0到1)。

设置为 0 时等同于关闭字符串转数组。

字符串数组加密方式 stringArrayEncoding

该选项会降低脚本运行速度。

支持使用 base64 或 rc4 对字符串数组中的所有字符串字面进行编码,并插入一个特殊代码,用于在运行时解码。

每个字符串数组值都将使用从传递的列表中随机挑选的编码进行编码。这样就可以使用多种编码。

  • :不对字符串数组进行编码
  • Base64:使用 Base64 编码字符串数组值
  • RC4:使用 RC4 对字符串数组值进行编码。速度比 Base64 慢 30-50%,但难以获得初始值。建议在使用 RC4 编码时禁用 unicodeEscapeSequence 选项,以防止混淆代码体积过大。 例如,同时勾选 无、Base64、RC4 时,部分字符串数组将不会被编码,而部分将使用 Base64 和 RC4 编码。

字符串数组索引方式 stringArrayIndexesType

  • 十六进制数字:用十六进制数字表示索引(如 0x0, 0x1),解密更难。
  • 十六进制数字字符串:用十六进制字符串表示索引(如 '0x0', '0x1')。

字符串调用转换 stringArrayCallsTransform

将字符串数组加密的取值函数转换为更复杂的形式,可干扰自动化反混淆工具的字符串提取逻辑,延长逆向工程时间。

字符串调用转换阈值 stringArrayCallsTransformThreshold

调整 字符串调用转换 功能的阈值。

偏移字符串数组索引值 stringArrayIndexShift

// 混淆后(假设偏移量=0x42)
const str = _0x1234(0x0 + 0x42); // 实际访问 _0x1234[0x42] = 'Hello'

字符串数组轮转 stringArrayRotate

启用后,混淆器会对字符串数组(stringArray)中的元素顺序进行随机轮转(即整体位移),使得原始索引与字符串的对应关系被破坏,进一步增加静态分析的难度,对运行时性能无影响。

// 原始数组 
['A', 'B', 'C', 'D'] → 轮转后可能变为 ['C', 'D', 'A', 'B']

字符串数组随机乱序 stringArrayShuffle

启用后,混淆器会对字符串数组(stringArray)中的元素顺序进行完全随机打乱(类似洗牌),彻底破坏原始索引与字符串的对应关系,大幅增加逆向分析的难度。

  • 强干扰性:与 stringArrayRotate(轮转)不同,乱序是完全随机的,无规律可循。
  • 零运行时开销:乱序仅发生在代码混淆阶段,不影响执行性能。
// 原始数组  
['API_KEY', 'SECRET', 'PASSWORD'] → 可能被乱序为 ['PASSWORD', 'API_KEY', 'SECRET'] 

字符串数组包装器链式调用 stringArrayWrappersChainedCalls

启用后,混淆器会将字符串数组(stringArray)的访问逻辑拆分为多级链式函数调用,通过嵌套的包装函数层层解密,使得直接追踪真实字符串的引用路径变得极其困难。

array[0] 可能被转换为 _0xfunc1(_0xfunc2(_0xfunc3(0x0))),形成调用链,干扰调试器的单步跟踪,增加静态还原成本。

注意:过度使用可能导致代码膨胀,建议在关键敏感字符串处启用。

字符串数组包装器数量 stringArrayWrappersCount

用于控制字符串数组(stringArray)的动态解密函数的生成数量。数值越大,混淆器会生成越多的冗余包装函数来分散对真实字符串访问逻辑的追踪,从而增强对抗逆向分析的能力。

示例(假设 stringArrayWrappersCount: 2):

// 原始访问  
array[0] → 可能被转换为 _0xwrapper2(_0xwrapper1(0x0))  

注意:过度增加此值可能导致代码冗余,建议根据安全需求平衡(一般不超过 3)。

字符串数组包装器形式 stringArrayWrappersType

用于定义字符串数组包装函数的生成方式。该选项对运行时性能无影响,可根据混淆需求选择。

示例:

// '函数形式
function _0x1234(x) { return array[x]; }  

// 变量形式
const _0x1234 = function(x) { return array[x]; };  

字符串数组包装器参数最大数量 stringArrayWrappersParametersMaxCount

控制字符串数组包装函数的参数数量上限。通过不同参数数量的包装函数(如 _0xfunc(a)_0xfunc(a,b) 等),进一步干扰逆向分析中对函数调用模式的规律性识别。

示例:

// 可能生成的包装函数形式  
_0xfunc1(0x0);          // 无额外参数  
_0xfunc2(0x0, true);    // 带额外干扰参数  

强制转换字符串 forceTransformStrings

设置需要强制转换成数组形式的字符串,可以将关键性的字符串加入强制转换,避免因为转换阈值的原因漏掉关键部分。

支持正则表达式。

白名单字符串 reservedStrings

加入到白名单中的字符串不会被转换成数组形式。

支持正则表达式。

常见问题

加密后的代码无法运行?

本工具对原始 JavaScript 代码的规范性要求极高。建议采用闭包的写法,同时该加分号的地方加分号,该加大括号的地方加大括号。

如果确保代码写得没问题,加密后仍有报错,请检查安全域名及变量混淆相关配置是否正确。

这个加密工具加密后的代码是绝对安全的吗?

这个工具只能用来混淆代码,使得代码变得不可读以及难以被还原。简而言之是只能防住大部分的小白,真正的大神还是能对代码进行逆向破解的。

因为 JavaScript 需要在浏览器前端读取运行,因此也不可能有 100% 无法被破解的 JavaScript 加密。(如果有,也是骗人的……

为什么加密后的代码比原始代码大很多?

因为加密后的代码中插入了很多额外的代码,用来起到保护作用。

使用本工具加密后,再使用其它工具加密一次,是否会更安全?

千万别这么做。多个加密工具配合使用只会起反作用,同时还可能破坏代码的原始结构,导致代码无法正常运行。

你们会偷偷保存加密前的代码吗?

绝对不会!本工具全程在本地进行加密。如果仍觉得不放心,可以在工具载入完成后,断掉网再进行加密。

我的原始代码丢了,能从加密后的代码中找回吗?

找不回了。代码一旦加密,神仙也无法恢复出原始代码。因此请保存好原始代码。

这个工具可以用来加密 Node.js 源代码吗?

可以。