公司由于业务需要,要求实现代码混淆,经过两天的间断性尝试终于找到的一款混淆插件
先说一说一开始尝试的几款:
1、vite-plugin-obfuscator :打包之后实现了混淆,但是上了sit 之后,出现样式丢失问题,看自己的配置项, 将stringArray设置为:stringArray: false。到了测试环境看过之后,混淆程度是很高,很多label名没有变成混淆后的字符串。但如果stringArray设置为true,打包之后就会出现样式丢失问题。
2、rollup-plugin-javascript-obfuscator :打包之后没有任何混淆变化,查资料更改配置之后,有混淆,看似加了很多垃圾代码。运行起来,本地就有报错,一开始是报
我将项目下用到这个变量的地方删除了,查了之后之后这里用到了:
//创建路由器
const router = createRouter({
//路由模式hash
history: createWebHistory(import.meta.env.BASE_URL),
routes: constantRoute,
//滚动行为
scrollBehavior (to, from, savedPosition) {
if (savedPosition) {
//此处意思 即若回退页面,返回savedPosition,且页面不置顶
return savedPosition
} else {
//此处意思 若页面跳转新页面,则页面置顶
return { x: 0, y: 0 ,behavior:'smooth'}
}
}
})
这里也可以不写,所以我直接去掉了,后面又报错路由问题,后面解决之后又出现了请求接口时报错,这个无法解决,猜测是 stringArray: true, 配置项开启导致的。
stringArray: true, // 将stringArray数组移位固定和随机(在代码混淆时生成)的位置。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
最后我在github上看到一个插件 vite-plugin-bundle-obfuscator,但是这次配置项stringArray,我也是设为false。js混淆成功,且打包之后一切正常。混淆程度跟vite-plugin-obfuscator 一样。
但也已满足了我的业务需求。代码及配置如下:
import vitePluginBundleObfuscator from "vite-plugin-bundle-obfuscator";
return defineConfig({
build: {
minify: "esbuild", // 默认
rollupOptions: {
output: {
entryFileNames: `js/[name].[hash].js`,
chunkFileNames: `js/[name].[hash].js`,
assetFileNames: "static/[ext]/[hash].[ext]",
},
}, // 打包后文件的存放路径
},
esbuild: {
drop: ["console", "debugger"], //打包去除
},
resolve: {
// alias: {
// "@": fileURLToPath(new URL("./src", import.meta.url)),
// },
alias: {
"@": path.resolve("./src"), // 相对路径别名配置,使用 @ 代替 src
// "@": path.resolve(__dirname, "src"),
},
},
plugins: [
vue(),
VueSetup(),
AutoImport({
resolvers: [VantResolver()],
}),
Components({
resolvers: [VantResolver()],
}),
vitePluginBundleObfuscator({
excludes: [],
enable: true,
log: true,
autoExcludeNodeModules: false,
threadPool: false,
options: {
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 1,
deadCodeInjection: false,
debugProtection: false,
debugProtectionInterval: 0,
disableConsoleOutput: false,
identifierNamesGenerator: "hexadecimal",
log: false,
numbersToExpressions: false,
renameGlobals: false,
selfDefending: true,
simplify: true,
splitStrings: false,
stringArray: false,
stringArrayCallsTransform: false,
stringArrayCallsTransformThreshold: 0.5,
stringArrayEncoding: [],
stringArrayIndexShift: true,
stringArrayRotate: true,
stringArrayShuffle: true,
stringArrayWrappersCount: 1,
stringArrayWrappersChainedCalls: true,
stringArrayWrappersParametersMaxCount: 2,
stringArrayWrappersType: "variable",
stringArrayThreshold: 0.75,
unicodeEscapeSequence: false,
},
}),
],
})
};