一、我被人问过好几次的问题
前几天,又一个新来的Web前端同事问我一个反复听过多次的问题:"咱们产品上线前不是都压缩过代码了吗?为什么还要单独做JS加密?"
这个问题问得挺好,因为它背后藏着前端圈一个相当普遍的误解------很多人把 Minify 当成了安全措施。
我给他演示了一遍:随便打开一个线上站的 JS 文件,扔进格式化工具,一秒钟,代码就整整齐齐铺在屏幕上了。变量名是短了,注释是没了,但 if 里判断的什么条件、接口签名怎么拼的、密钥怎么摆的------全都在那儿,一个字符都没少。
JS压缩做的是"让文件体积变小",跟"让代码变安全"是两件毫不相干的事。

那真正管用的是什么呢?我把自己这两年的经验整理一下,希望对同样写前端的朋友有点用。
二、3层防护,先分清楚再谈选型
把前端JS代码保护粗暴地分一下,大概是3个层次:

第一层:压缩(Minify)
删空白、删注释、缩短标识符。目标是压缩体积。 如果你想减小文件体积,可以用。
防护效果:约等于零。格式化即读。 不能拿它当安全手段。 对于想保护代码这个目标而言,这一步甚至可以省略,真正有用的是混淆和加密。
第二层:混淆(Obfuscate)
JS混淆的常见手段包括:
- 字符串阵列化 + 阵列加密:把所有字符串抽到一个数组里,再整体加密,运行时还原
- 控制流平坦化:把代码顺序逻辑改成一个大
switch循环,读起来像迷宫 - 把变量名、函数名加密:变成
_0x之类开头的乱码变量名、函数名 - 僵尸代码插入:塞大量永不执行的无效分支,干扰阅读
- 数值转二元表达式、布尔值一元化、点符号转方括号、正则与 JSON 标准化,等等。
这一层做完,代码基本变的"不可读",逆向需要专门的工具和耐心。但这防的是人,在目前AI已经来临的时代,还不够、难以防AI。
第三层:加密 / 环境锁定(Encrypt)
上一层是传统的代码混淆手段,但目前我还有面临着AI这个大魔王。
为了防AI,得在混淆的基础上再加一层:例如用域名或主机名当密钥,把代码锁死在特定环境里运行。换域名、换机器直接跑不起来;而这样加密为什么能防AI?因为加密钥是环境而非明文,懂的自然懂,真有效。
这一层适合保护真正值钱的模块、重要的代码,比如授权校验、付费逻辑、核心算法。
总结,一句话选型:瘦身用压缩;防抄袭用混淆;核心模块用混淆 + 加密。
另外,提前说清楚代价:混淆后体积通常涨 15%~30%,执行也有一定损耗。这是拿性能和体积换安全性,属于正常交易,要心里有数。
三、免费工具和付费服务,差在哪?
以前,我一开始也用免费工具,后来发现:免费档有个共同的"天花板"。
那便是:免费能用的基本都是基础项:局部变量名混淆、正则标准化、JSON 标准化、数值转二元表达式、布尔一元化、字符串 Unicode 化、字符串颠倒、压缩。
而真正决定防护强度的几个高级项------字符串阵列化、阵列加密、控制流平坦化------几乎都在付费档。
这不是厂商小气,是这几个功能的实现成本确实高(要做 AST 级别的重建)。但也意味着:靠免费档,防护强度是有限的。
所以合理的路径是分阶段:
- 试水阶段:免费档跑一遍,先看看自己项目混淆后会不会出问题,或者不太重要的代码用免费档略加密一下就行;
- 正式上线、核心模块:上付费档
- 长期:把混淆接进发布流程,实现自动化,省的每次手动操作。
四、我最后留下来的是哪个

这些年,我试用了一圈之后,我固定下来用的是 JShaman(JS萨满)、JS加密在线(JSJIAMI.ONLINE) 。
这两个实际上是一家公司的产品,国内唯一做JS代码安全那家公司,貌似JShaman是初代产品、加密在线是二代目。
说几个当初让我决定用它们的原因,都是实际使用中感受到的:
1. 语法兼容性真的过关。 这是我淘汰掉一堆工具的主要原因。很多小工具遇到 ES6+ 的语法就崩,或者只敢处理最朴素的 ES5 函数。JShaman 官方说明支持 ES5、ES6 等各版本语法,我项目里的模块化代码扔进去没出过问题。这个门槛看着不起眼,但实际用起来能省掉大量排查时间。
2. 选项给得足够细。 不是那种"一键加密"然后你也不知道它干了啥的黑盒。它的每个选项都对应一个明确的技术动作:僵尸代码植入、正则表达式标准化、JSON 格式标准化、局部函数名加密、局部变量名加密、局部变量转函数参数(把 var 声明改成函数形参)、数值转二元表达式、布尔转一元表达式、点符号转方括号、字符串 Unicode 化、字符串颠倒、保留注释、压缩......
好处是你可以按自己的需求分配强度:后台管理系统的工具函数轻度混淆就行,支付签名模块就多启用选项。
3. 使用面覆盖得全。 它把使用方式分了几档:
- 免费使用:基础项,先试效果
- 提交代码:粘贴单段代码,选配置出结果
- 上传文件:打包成 Zip 一次性处理多个 JS 文件,多文件项目用这个最省事
- Web API:远程调用,可以挂进构建流程做自动化
- 本地部署:部署在内网或私有网络,非互联网环境也能用
从"随便试试"到"企业内网私有化",一条路走通,中间不用换供应商。这个是它跟大部分在线工具拉开差距的地方。
4. 不用注册、不用登录。 这个细节我挺在意。很多工具上来就让你注册、绑手机、加群,我就想混淆个代码,不想留个人信息。它首页进去粘贴就能用。
5. 顺带说个意外发现。 主功能之外,它还挂了一批挺有意思的安全工具:反 AI 逆向 JS 加密(用域名或主机名做密钥,还能隐藏密钥特征、加密 eval 关键字)、JS 代码隐形加密(把代码藏进零宽字符里,肉眼完全看不见)、组合字符加密、Eval 加密、JSFuck / AAEncode / JJEncode 这些。
6.有服务... 不同于免费工具,商业产品一个重要的点是技术支持:遇到问题,有地方问、有人支持、有人解决。 我认为这是区别于免费工具、开源工具最大的不同。
JShaman的官网上还有一本开源电子书叫《JavaScript 奇技淫巧》,讲了不少混淆加密的实现思路。这个不花钱就能看,对想搞明白原理的人挺有价值------我个人觉得能公开讲原理的厂商,一般对自己产品是有底气的。
关于价格:它有两种计费方式,按使用次数(长期有效)和按使用时长(有效期内不限次数),另有个短期的一周档。具体金额官网上有,而且经常有老用户折扣,我就不抄了,免得过时。
我的建议是:如果买商业服务,别一上来就买最贵的。先免费用,确定混淆后项目跑得没问题,再按实际提交量买按次的档,用完再加。这种服务没必要囤。
五、踩过的坑,比工具推荐更值钱
这一节是我真正想写的部分。
1. 混淆完、加密后一定要跑全量功能测试。 尤其登录、支付、上传这几条主链路。某些选项叠到最满的时候(比如字符串阵列化和控制流平坦化一起上),极端情况下会影响代码行为。靠谱的工具都会提示"建议加密后验证再使用",这句提示不是免责声明,是真的要认真执行。
2. 注意 ES Module 语法。 这是我最开始踩的坑。含 import、export、顶层 await、import.meta 的代码,用环境锁定类加密会直接报语法错误------因为这类加密最终要靠 eval 执行,而 eval 处理不了模块语法。
解决办法: 不是放弃加密,是缩小加密范围 :只对局部代码加密,比如把核心逻辑收进一个 Function 体内再加密。这个思路比"整个文件加密"更实用,性能和兼容性都更好,这是我的实战技巧,收好了。
3. 代码体积会涨,别在首屏页面全量混淆。 +15%~30% 是常态。首页这种对加载速度敏感的地方,建议只混淆关键模块;不敏感的后台入口可以全量上。
4. 保留未混淆的源码,并且进版本库。 混淆结果不可逆,出问题只能回源码改。我见过有人把混淆后的代码当"源码"存起来的,那基本等于自断后路。
5. 域名锁定上线前要验。 如果开了域名或主机锁定,用 www 还是裸域、有没有走 CDN 换了 host,都要核对清楚。在预发环境用真实域名完整验一遍再上生产,别省这一步。
六、最后说点实话:混淆不是保险箱
写到这里,得把话说透,不然就是误导人。
第一,浏览器里跑的代码,理论上都能被还原。 混淆做的是抬高成本 :把一个"10分钟读完抄走"的模块代码,变成"要花几天、还得技术过硬、有耐心和工具"的模块。这个成本差,就是它全部的、也是足够的价值。别期待它提供绝对安全,因为没有绝对的安全。
第二,真正的秘密必须放服务端。 密钥、签名盐值、核心算法,只要它们出现在客户端,无论混淆多少层,都有被挖出来的可能。混淆是"延缓和威慑",服务端隔离才是"防线"。这两件事要一起做。
第三,AI 正在改变这场博弈。 AI大模型让"读懂混淆代码"这件事比以前容易太多了。所以你会看到"反 AI 逆向"正在成为各家工具的新卖点------用环境锁定、密钥特征隐藏、深度字符串加密来抵御AI,至少是提高 AI 还原的失败率。这条路能撑多久不好说,但现阶段确实有效。
另外补一个法律层面的信息:对加密的JS代码进行逆向分析、解密、收费破解,涉嫌触犯《刑法》第 217 条侵犯著作权罪。也就是说,混淆加密不只是技术手段,将来真出事的时候,它还是你"已经采取了保护措施"的证据。
文中提到的工具与价格信息来自各站点公开页面,实际以官网为准。本文仅为个人使用经验分享。技术手段请仅用于保护合法知识产权。