背景
公司代码提供给第三方使用,为了不完全泄露源码,需要对给出的代码进行加密混淆,前端代码虽然无法做到完全加密混淆,但是通过使用 webpack-obfuscator 通过增加随机废代码段、字符编码转义等方法可以使构建代码完全混淆,达到无法恢复源码甚至无法阅读的目的。

安装

webpack-obfuscator https://www.npmjs.com/package/webpack-obfuscator

npm install --save-dev webpack-obfuscator
配置

// webpack.config.js
const JavaScriptObfuscator = require('webpack-obfuscator');
module.exports = {entry: {'abc': './test/input/index.js','cde': './test/input/index1.js'},output: {path: 'dist',filename: '[name].js'},plugins: [new JavaScriptObfuscator({rotateUnicodeArray: true// 数组内是需要排除的文件}, ['abc.js'])]
};

vue cli 项目配置:

// vue.config.js
const path = require('path');
var JavaScriptObfuscator = require('webpack-obfuscator');
module.exports = {publicPath: process.env.NODE_ENV === 'production' ? './' : '/',productionSourceMap: false,configureWebpack: {plugins: [new JavaScriptObfuscator({rotateStringArray: true,}, [])]},pwa: {},pages: {}
}

若只想在打包时加密混淆,本地运行时不混淆,可以进行以下的配置:

configureWebpack: (process.env.NODE_ENV === 'production') ? {plugins: [new JavaScriptObfuscator({// ...}, [])]} : {},

vue cli 2.x 配置在 webpack.prod.conf.js 中

构建
npm run build
构建文件对比

  1. 原始文件
// test.js
function abc() {for (let i = 0; i < 10; i++) {console.log(`第${i}个,你好,hello`)}
}
abc()
  1. webpack 默认工具uglifyjs-webpack-plugin
webpackJsonp([2],{lVK7:function(o,l){!function(){for(var o=0;o<10;o++)console.log("第"+o+"个,你好,hello")}()}},["lVK7"]);
  1. webpack-obfuscator 无参数时

new JavaScriptObfuscator({}, [])
var _0x1f6e=["个,你好,hello","lVK7","log"];!function(n,o){!function(o){for(;--o;)n.push(n.shift())}(++o)}(_0x1f6e,323);var _0x3655=function(n,o){return _0x1f6e[n-=0]};webpackJsonp([2],{lVK7:function(n,o){!function(){for(var n=0;n<10;n++)console[_0x3655("0x0")]("第"+n+_0x3655("0x1"))}()}},[_0x3655("0x2")]);
  1. webpack-obfuscator 高度混淆
    低性能:性能比没有模糊处理慢 50-100%
new JavaScriptObfuscator({// 压缩代码compact: true,// 是否启用控制流扁平化(降低1.5倍的运行速度)controlFlowFlattening: true,// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。controlFlowFlatteningThreshold: 1,// 随机的死代码块(增加了混淆代码的大小)deadCodeInjection: true,// 死代码块的影响概率deadCodeInjectionThreshold: 1,// 此选项几乎不可能使用开发者工具的控制台选项卡debugProtection: true,// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。debugProtectionInterval: true,// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。disableConsoleOutput: true,// 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)identifierNamesGenerator: 'hexadecimal',log: false,// 是否启用全局变量和函数名称的混淆renameGlobals: false,// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。rotateStringArray: true,// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;selfDefending: true,// 删除字符串文字并将它们放在一个特殊的数组中stringArray: true,stringArrayEncoding: 'rc4',stringArrayThreshold: 1,// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。transformObjectKeys: true,unicodeEscapeSequence: false
}, []),

构建后文件大小: 29,999 字节(29.2 KB)

var _0xa0d1=["w7Bzw6oKw6E=","wrwIUcOVw4M=","w4bChi3DtcOQ","wpLDtsK5w4LDpA==","OUlQwp1z","woEqw4XCtsOe","YR3DrkDCiA==","woAjwq/Ci8KQ","dDNzw5bDgA==",
// ...
("0x201","xatR")]=function(x){return x()},x[_0x34e6("0x202","vdcx")](_0x2c01f8)},4e3);
  1. webpack-obfuscator 中等混淆
    最佳性能:性能比没有模糊处理慢 30-35%
new JavaScriptObfuscator({// 压缩代码compact: true,// 是否启用控制流扁平化(降低1.5倍的运行速度)controlFlowFlattening: true,// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。controlFlowFlatteningThreshold: 0.75,// 随机的死代码块(增加了混淆代码的大小)deadCodeInjection: true,// 死代码块的影响概率deadCodeInjectionThreshold: 0.4,// 此选项几乎不可能使用开发者工具的控制台选项卡debugProtection: false,// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。debugProtectionInterval: false,// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。disableConsoleOutput: true,// 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)identifierNamesGenerator: 'hexadecimal',log: false,// 是否启用全局变量和函数名称的混淆renameGlobals: false,// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。rotateStringArray: true,// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;selfDefending: true,// 删除字符串文字并将它们放在一个特殊的数组中stringArray: true,stringArrayEncoding: 'base64',stringArrayThreshold: 0.75,transformObjectKeys: true,// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。unicodeEscapeSequence: false
}, []),
构建后文件大小:7066字节(6.90kb)var _0x1a25=["UmFzT1U=","RkVIc0o=","VUt2eW4=","Q29IS0g=","V1NSZ0k=","d3RNT2w=","dlV6cUw=","RlpzZWg=","QnpzSlE=","cXBqQ1k=","YXBwbHk=","bFZLNw==","Y3p1Ymo=","TFZlQXE=","Y2NKWlY=","cmV0dXJuIChmdW5jdGlvbigpIA==",
// ...
(b[_0x4bcb("0x2a")]("第"+c,b[_0x4bcb("0x2b")]))}})}},[_0x4bcb("0x2f")]);
  1. webpack-obfuscator 低混淆
    高性能: 性能稍微慢于没javascript教程有混淆
new JavaScriptObfuscator({// 压缩代码compact: true,// 是否启用控制流扁平化(降低1.5倍的运行速度)controlFlowFlattening: false,// 随机的死代码块(增加了混淆代码的大小)deadCodeInjection: false,// 此选项几乎不可能使用开发者工具的控制台选项卡debugProtection: false,// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。debugProtectionInterval: false,// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。disableConsoleOutput: true,// 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)identifierNamesGenerator: 'hexadecimal',log: false,// 是否启用全局变量和函数名称的混淆renameGlobals: false,// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。rotateStringArray: true,// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;selfDefending: true,// 删除字符串文字并将它们放在一个特殊的数组中stringArray: true,stringArrayEncoding: false,stringArrayThreshold: 0.75,// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。unicodeEscapeSequence: false
}, []),

构建后文件大小: 2,424 字节(2.36 KB)

var _0x37a6=[“exception”,“trace”,“console”,“个,你好,hello”,“lVK7”,“apply”,"return (function() ",’{}.constructor(“return this”)( )’,“log”,“warn”,“debug”,“info”,“error”];!function(n,e){var o=function(e){for(;–e;)n.push(n.shift())};
// …
_0xe1fd(“0x3”)}()}},[_0xe1fd(“0xc”)]);
对比表格
文件名称 文件大小 正常构建 无参数 高度混淆 中度混淆 低度混淆
test.js 117字节 177字节 363字节 29.2 KB(29,999 字节) 6.90KB(7066字节) 2.36 KB(2,424 字节)
jquery.js 111 KB (113,852 字节) 85.0 KB (87,064 字节) 115 KB (117,770 字节) 1.24 MB (1,304,998 字节) 401 KB (411,543 字节) 117 KB (120,243 字节)
主要属性

{// 压缩,无换行compact: true,// 是否启用控制流扁平化(降低1.5倍的运行速度)controlFlowFlattening: false,// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。controlFlowFlatteningThreshold: 0.75,// 随机的死代码块(增加了混淆代码的大小)deadCodeInjection: false,// 死代码块的影响概率deadCodeInjectionThreshold: 0.4,// 此选项几乎不可能使用开发者工具的控制台选项卡debugProtection: false,// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。debugProtectionInterval: false,// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。disableConsoleOutput: false,//锁定混淆的源代码,使其仅在特定域和/或子域上运行。这使得某人只需复制并粘贴您的源代码并在其他地方运行就变得非常困难。domainLock: [],//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)identifierNamesGenerator: 'hexadecimal',//全局标识符添加特定前缀,在混淆同一页面上加载的多个文件时使用此选项。此选项有助于避免这些文件的全局标识符之间发生冲突。为每个文件使用不同的前缀identifiersPrefix: '',inputFileName: '',// 允许将信息记录到控制台。log: false,// 是否启用全局变量和函数名称的混淆renameGlobals: false,// 禁用模糊处理和生成标识符reservedNames: [],// 禁用字符串文字的转换reservedStrings: [],// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。rotateStringArray: true,// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;seed: 0,selfDefending: false,sourceMap: false,sourceMapBaseUrl: '',sourceMapFileName: '',sourceMapMode: 'separate',// 删除字符串文字并将它们放在一个特殊的数组中stringArray: true,// 编码的所有字符串文字stringArray使用base64或rc4并插入即用其解码回在运行时的特殊代码。true(boolean):stringArray使用编码值base64;false(boolean):不编码stringArray值;'base64'(string):stringArray使用编码值base64;'rc4'(string):stringArray使用编码值rc4。大约慢30-50%base64,但更难获得初始值。建议禁用unicodeEscapeSequence带rc4编码的选项以防止非常大的混淆代码。stringArrayEncoding: false,// 调整字符串文字将插入stringArray的概率stringArrayThreshold: 0.75,// 您可以将混淆代码的目标环境设置为以下之一:Browser;Browser No Eval;Nodetarget: 'browser',// 是否启用混淆对象键transformObjectKeys: false,// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。unicodeEscapeSequence: false
}

注意
安装 webpack-obfuscator 时要注意webpack-obfuscator的版本要与本地项目 webpack 版本相匹配,我用的是webpack-obfuscator@0.18.0 项目 webpack 是 4.x 版本。(4.x版 本 webpack 使用最新版 webpack-obfuscator@3.3.0 会报错无法使用,webpack 杳升级到 5.x 版本)。
excludes数组 的兼容 multimatch包语sql语句法,例如支持 [‘js/chunk-vendors..js’]、 [‘excluded_bundle_name.js’, '_bundle_name.js’] 或 'excluded_bundle_name.js’等。
文章地址:https://www.cnblogs.com/dragonir/p/14445767.html 作者:dragonir

vue项目配置 webpack-obfuscator 进行代码加密混淆相关推荐

  1. 使用Jenkins持续集成Vue项目配置Sonar任务

    title: 使用Jenkins持续集成Vue项目配置Sonar任务 tags: jenkins Vue.js Sonar categories: ci date: 2017-12-05 22:09: ...

  2. 新版Vue项目配置项目名称-publicPath-前端_v1.0.2

    文件名称 版本号 作者 qq 版本 新版Vue项目配置项目名称-publicPath-前端 v1.0.2 学生宫布 8416837 webpack 4.28.4 文章目录 js配置 js配置 定义全局 ...

  3. Vue项目配置本地访问地址和IP访问地址

    Vue项目配置本地访问地址和IP访问地址 1.在config/index.js配置: dev: {host: '0.0.0.0', } 2.在build/webpack.dev.config.js更改 ...

  4. SwitchHosts使用和vue项目配置

    SwitchHosts使用和vue项目配置 1.解压SwitchHosts到本地电脑上,右键以管理员身份运行exe文件: 2.配置自己需要的域名 3.vue项目中修改配置文件 webpack.dev. ...

  5. vue项目设置服务器地址,vue项目配置后端服务器地址

    vue项目配置后端服务器地址 内容精选 换一换 查询负载均衡器状态树.可通过该接口查询负载均衡器关联的监听器.后端云服务器组.后端云服务器.健康检查.转发策略.转发规则的主要信息,了解负载均衡器下资源 ...

  6. vue 不生效 打包 样式_解决在vue项目中webpack打包后字体不生效的问题

    最近在项目开发过程中遇到如下问题:开发环境中设置的字体样式使用webpack打包后到生产环境不生效.如图: 打开控制台查看元素样式,发现在开发环境的时候"微软雅黑"被解析成unic ...

  7. Java代码加密混淆工具有哪些?

    在Java中,代码加密混淆工具可以帮助开发者将源代码进行加密和混淆处理,以增加代码的安全性和保护知识产权.以下是一些流行的Java代码加密混淆工具: 第一款:ProGuard:ProGuard Pro ...

  8. exe一机一码加密工具_Python代码加密混淆

    我多想再见你 哪怕匆匆一眼就别离 python作为一种解释型语言,源代码加密本身比较困难.但有时候我们在发布一款python产品时又必须考虑到代码的加密性,以避免源代码泄露.为此,我查阅了一些资料,研 ...

  9. VBA 工程代码加密混淆器,保护你的宏作品

    个人制作的 VBA 代码加密混淆器,帮你加密你的宏代码,让它不再那么易读.因 VBA 的方便一直以来都喜欢用它写一些小工具,了解多了也就知道这种代码编写的工具完全没有安全性可言,工程密码形同虚设,很容 ...

最新文章

  1. python绘制盖尔圆并做特征值的隔离
  2. js获取当前日期_vue项目中获取前后N天日期
  3. PHP - 图像处理
  4. serialize和unserialize函数
  5. ArcGIS操作总结(更新中......)
  6. Centos下安装nginx步骤解析
  7. c# json 汉字乱码_C# 读取Json内的数据,中文乱码,怎么解决
  8. 2021年Web前端开发的趋势有哪些
  9. English音标(全)与单词家园
  10. mysql身份证号的类型_MySQL--隐藏手机号、身份证号三种方式
  11. 【阅读笔记】(语义分割最全总结,综述)《A Review on Deep Learning Techniques Applied to Semantic Segmentation》
  12. C#实现百度翻译功能
  13. Bootstrap 对齐方式
  14. 高等数学:第六章 定积分的应用(4)平面曲线的弧长
  15. 科目三考场视频最新专业高清+实地模拟考试陪练车
  16. Android Device Moniter部分问题的解决办法:
  17. 每年工作日与非工作日的设置
  18. 推荐10款 Java 程序员测试工具
  19. 如何用微信编辑器排版出美观的图文消息
  20. dpdk mempool的逻辑

热门文章

  1. 学习和使用UE4的第一步——安装和介绍Epic Games客户端和虚幻引擎
  2. 一起赚美金:Niche站变现案例分享(2)
  3. 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr() ,这种方法在大部分情况下都是有效的。但是在通过了Apache,Squi...
  4. Redis主从复制(Replication)和哨兵模式(Sentinel)
  5. 学生DW静态网页设计 旅游—我的家乡新密(15页)含论文 新密旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板
  6. oracle idc排名,idc 排行_2015中国IDC排行榜TOP20
  7. Linux_shell——第5章 一团乱麻?没这回事
  8. 【Python】打断点
  9. 解锁Android性能优化的五大误区!面试必问
  10. 转载java基础总结大全(使用)