1、JavaScriptObfuscator
https://github.com/lrusso/JavaScriptObfuscator
// 在线转换地址
https://lrusso.github.io/JavaScriptObfuscator/JavaScriptObfuscator.htm
2、jsfuck
https://github.com/aemkei/jsfuck
3、terser
https://github.com/terser/terser
4、UglifyJS
https://github.com/mishoo/UglifyJS
如何混淆代码的:同terser
收费混淆工具
1、jscrambler
https://jscrambler.com/
// webpack
https://jscrambler.com/blog/protect-your-code-while-using-webpack
2、jshaman
在线转换工具,官方文档介绍购买后可以提供API,或提供私有化部署
http://www.jshaman.com/
3、stunnix
http://stunnix.com/store/
// 安装向导
http://stunnix.com/support/doc/jo/install-guide.shtml
// 使用教程
https://www.cnblogs.com/zzugyl/p/4204387.html
当然还有其它的混淆工具,好多热度也不高或者N多年没有维护,这里就不一一列举了。
通过对比,这里着重介绍这两个terser,UglifyJS
集成使用
现在基本都是vue、react项目,都会使用webpack、vite等管理工具,所以terser,UglifyJS也是以插件的形式放到webpack、vite统一配置使用。
webpack方式
1、terser-webpack-plugin
https://webpack.docschina.org/plugins/terser-webpack-plugin/
npm install terser-webpack-plugin --save-dev
2、uglifyjs-webpack-plugin
https://v4.webpack.js.org/plugins/uglifyjs-webpack-plugin/
npm install uglifyjs-webpack-plugin --save-dev
vite方式
1、rollup-plugin-terser
npm install rollup-plugin-terser --save-dev
import { defineConfig } from 'vite';
import { terser } from 'rollup-plugin-terser';
export default defineConfig({
plugins: [terser()],
});
2、rollup-plugin-obfuscator
https://github.com/getkey/rollup-plugin-obfuscator
https://github.com/javascript-obfuscator/javascript-obfuscator
npm install --save-dev rollup-plugin-obfuscator javascript-obfuscator
or
yarn add --dev rollup-plugin-obfuscator javascript-obfuscator
如果打包报错,试一下
yarn add javascript-obfuscator -D
4、在vite.config.ts中配置
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import obfuscator from 'rollup-plugin-obfuscator';
export default defineConfig({
// base: "",
build: {
minify: 'esbuild', // 默认
},
esbuild: {
drop: ['console', 'debugger'],//打包去除
},
plugins: [
vue(),
obfuscator({
global:false,
// options配置项实际为 javascript-obfuscator 选项,具体可查看https://github.com/javascript-obfuscator/javascript-obfuscator
options: {
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 0.75,
numbersToExpressions: true,
simplify: true,
stringArrayShuffle: true,
splitStrings: true,
splitStringsChunkLength: 10,
rotateUnicodeArray: true,
deadCodeInjection: true,
deadCodeInjectionThreshold: 0.4,
debugProtection: false,
debugProtectionInterval: 2000,
disableConsoleOutput: true,
domainLock: [],
identifierNamesGenerator: "hexadecimal",
identifiersPrefix: "",
inputFileName: "",
log: true,
renameGlobals: true,
reservedNames: [],
reservedStrings: [],
seed: 0,
selfDefending: true,
sourceMap: false,
sourceMapBaseUrl: "",
sourceMapFileName: "",
sourceMapMode: "separate",
stringArray: true,
stringArrayEncoding: ["base64"],
stringArrayThreshold: 0.75,
target: "browser",
transformObjectKeys: true,
unicodeEscapeSequence: true,
domainLockRedirectUrl: "about:blank",
forceTransformStrings: [],
identifierNamesCache: null,
identifiersDictionary: [],
ignoreImports: true,
optionsPreset: "default",
renameProperties: false,
renamePropertiesMode: "safe",
sourceMapSourcesMode: "sources-content",
stringArrayCallsTransform: true,
stringArrayCallsTransformThreshold: 0.5,
stringArrayIndexesType: ["hexadecimal-number"],
stringArrayIndexShift: true,
stringArrayRotate: true,
stringArrayWrappersCount: 1,
stringArrayWrappersChainedCalls: true,
stringArrayWrappersParametersMaxCount: 2,
stringArrayWrappersType: "variable",
}
})
]
})
————————————
昔闻洞庭水,今上岳阳楼。
吴楚东南坼,乾坤日夜浮。
亲朋无一字,老病有孤舟。
戎马关山北,凭轩涕泗流。
- 登岳阳楼 【唐】杜甫