• webpack优化系列五:vue项目配置 webpack-obfuscator 进行代码加密混淆


    项目上线后为了不完全泄露源码,需要对给出的代码进行加密混淆,前端代码虽然无法做到完全加密混淆,但是通过使用 webpack-obfuscator 通过增加随机废代码段、字符编码转义等方法可以使构建代码完全混淆,达到无法恢复源码甚至无法阅读的目的。
    通过查阅后,经测试此方法可行,故记录,以便后续查看。

    网站推荐:https://www.npmjs.com/package/webpack-obfuscator

    webpack其他相关给、推荐
    一:webpack优化相关
    1:webpack优化系列一:webpack不同环境打包配置
    2:webpack优化系列二:Vue配置compression-webpack-plugin实现Gzip压缩
    3:webpack优化系列三:vue子目录路径更改—publicPath
    4:webpack优化系列四:vue打包后生成的chunk-vendors文件过大,利用SplitChunks插件,分离chunk
    5:webpack优化系列五:vue项目配置 webpack-obfuscator 进行代码加密混淆

    安装依赖

    注意:版本需正确,否则报错

    在这里插入图片描述

    常见webpack安装版本
    webpack3.4.1的安装方式
    npm install --save-dev javascript-obfuscator@0.10.0 webpack-obfuscator@0.10.0
    
    • 1
    webpack4的安装方式
    npm install --save-dev javascript-obfuscator webpack-obfuscator@2.6 
    
    • 1
    webpack5的安装方式
    npm install --save-dev javascript-obfuscator webpack-obfuscator
    
    • 1
    查看webpack应安装版本
    查看网站

    https://github.com/javascript-obfuscator/webpack-obfuscator/tags

    查看方式

    webpack-obfuscator git官网的tags的package.json上进行详细查看;

    文件配置

    配置项webpack.config.js
    // 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'])
      ]
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    配置项vue.config.js
    // vue.config.js
    const path = require('path');
    var JavaScriptObfuscator = require('webpack-obfuscator');
    // 生产环境,测试和正式
    const IS_PROD = ['production', 'prod', 'uat'].includes(process.env.NODE_ENV)
    module.exports = {
      publicPath: process.env.NODE_ENV === 'production' ? './' : '/',
      productionSourceMap: false,
      configureWebpack:config => {
    	  if (IS_PROD) { 
    	    return {
    	    plugins: [
    	      new JavaScriptObfuscator({
    	        rotateStringArray: true,
    	      }, [])
    	    ]
    	   }
        }
      },
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    详细配置
    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: ['base64'],
      stringArrayThreshold: 1,
      // 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
      transformObjectKeys: true,
      unicodeEscapeSequence: false
    }, []),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    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,
      // 此选项可能会略微降低脚本速度。使用Base64或RC4对stringArray的所有字符串文字进行编码,并插入一个特殊的函数,用于在运行时将其解码回来。
      stringArrayEncoding: ['base64'],
      stringArrayThreshold: 0.75,
      transformObjectKeys: true,
      // 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
      unicodeEscapeSequence: false
    }, []),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    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
    }, []),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    javaweb+vue汽车4S店车辆维修管理系统springboot
    《设计模式之美》第四章 总结
    ubuntu在线直接升级
    HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页
    服务器集群配置LDAP统一认证高可用集群(配置tsl安全链接)-centos9stream-openldap2.6.2
    深入了解Java位运算符
    [Azure - VM] 解决办法:无法通过SSH连接VM,解决错误:This service allows sftp connections only.
    [附源码]java毕业设计宠物商店管理系统
    迄今为止算是汇总了全网高级Java岗位面试题(附答案)建议收藏
    怎么给视频添加水印?几个简单的步骤就搞定
  • 原文地址:https://blog.csdn.net/duanhy_love/article/details/127324096