前端代码混淆加密(使用Terser、WebpackObfuscator)

news2024/9/19 17:42:22

零、相关技术及版本号

"vue": "2.6.12",
"@vue/cli-service": "4.4.6",
"javascript-obfuscator": "^4.1.1",
"terser-webpack-plugin": "^4.2.3",
"vue-template-compiler": "2.6.12",
"webpack-obfuscator": "^2.6.0"

一、需求说明

为了对公司项目进行安全防护措施,前端需要进行代码混淆加密处理。
这里就有个三个需求点:

  1. 压缩
  2. 混淆
  3. 加密

以此在网上查找到相应工具有:Terser、WebpackObfuscator

Terser:压缩代码、变量和函数名混淆、删除未使用代码

WebpackObfuscator:代码混淆、字符串加密、控制流扁平化

二、工具使用

npm install --save-dev terser-webpack-plugin@4
npm install --save-dev javascript-obfuscator webpack-obfuscator@2.6.0

  vue.config.js

const CompressionPlugin = require('compression-webpack-plugin'); // gzip压缩,无关可忽略

const TerserPlugin = require('terser-webpack-plugin');
const WebpackObfuscator = require('webpack-obfuscator');

const name = process.env.VUE_APP_TITLE || '*****' // 网页标题

module.exports = {
  // ......
  configureWebpack: config => {
    const plugins = [
      // gzip压缩,无关可忽略
      new CompressionPlugin({
        cache: false,
        test: /\.(js|css|html)?$/i,
        filename: '[path].gz[query]',
        algorithm: 'gzip',
        minRatio: 0.8
      })
    ];

    if (process.env.NODE_ENV === 'production') {
      // 使用 Terser 进行代码压缩和 source map 生成
      config.optimization = {
        minimizer: [
          new TerserPlugin({
            terserOptions: {
              compress: {
                warnings: false,
                drop_console: true, // 开启console.log压缩
                drop_debugger: true, // 移除debugger
              },
              sourceMap: true, // 启用 source map 生成
            },
            extractComments: false, // 是否将注释提取到单独的文件中
          }),
        ],
      };

      // 在 Terser 之后使用 WebpackObfuscator 进行混淆
      plugins.push(
        new WebpackObfuscator(
          {
            // 压缩代码
            compact: true, 
            // 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
            disableConsoleOutput: true,
            // 通过固定和随机(在代码混淆时生成)的位置移动数组。
            rotateStringArray: true, 
            // 标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
            identifierNamesGenerator: 'hexadecimal',
          },
          []
        )
      );
    }

    return {
      name: name,
      devtool: 'source-map', // 确保 devtool 设置为 'source-map' 或类似选项
      plugins: plugins
    };
  },
}

三、注意事项

1、WebpackObfuscator需要和javascript-obfuscator一起安装(在此项目的版本下)

      VueCli4 对应 webpack-obfuscator@2.6.0

npm install --save-dev javascript-obfuscator webpack-obfuscator@2.6.0

2、WebpackObfuscator进行混淆加密,需要Terser进行提前处理

① 使用 Terser 进行代码压缩和 source map 生成,

② 在 Terser 之后使用 WebpackObfuscator 进行混淆。

单独使用WebpackObfuscator的话,打包时就会一直报错(sourceAndMap):

3、配置configWebpack和开发环境设置

① 以函数形式配置configWebpack

     (注意Terser和WebpackObfuscator引入的方式不同,后者是放到plugins中)
② 设置在生产环境中才去使用混淆加密工具(开发环境会产生各种报错)

因版本问题导致花了很多时间研究并处理报错,版本对应很重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1962561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA后端拉取gitee仓库代码项目并将该工程打包成jar包

公司当前有一个系统用于导出项目,而每次导出的项目并不可以直接使用,需要手动从gitee代码仓库中获取一个模板代码然后将他们整合到一起它才是一个完整的项目,所以目前我的任务就是编写一个java程序可以自动地从gitee仓库拉取下来那个模板代码…

纯前端实现导出pdf文件(服务端不参与)

大致查阅了现阶段使用较多的几种方案,,大概有以下几种方式: 一、原生window.print()方法导出pdf 二、jspdf 三、jspdf html2canvas 四、pdfmake 方案优点缺点window.print()1、兼容性最好 2、可以将任意内容导出成 pdf 文档, 甚至是非改页面上的内容1…

⑦【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 系列文章: ①【从0制作自己的ros导航小车:介绍及准备】 ②【从0制作自己的ros导航小车:下位机篇】01、工程准备_标准库移植freertos ③【从0制作自己的ros导航小车&a…

Sobel Operator

什么是图像边缘? 边缘是指图像中灰度或颜色强度发生显著变化的区域。 什么是Sobel operator Sobel算子是一种用于图像处理的边缘检测算子。它通过计算图像灰度值的梯度来检测图像中的边缘。 什么情况产生梯度? 黑与白交界处。 Sobel 算子原理 计算P…

MLP多层感知机与Pytorch实现

参考文章: 1.动手学深度学习——多层感知机(原理解释代码详解)_多层感知机 代码-CSDN博客 2.4.1. 多层感知机 — 动手学深度学习 2.0.0 documentation 3.深度理解多层感知机(MLP) | 米奇妙妙屋 1. 神经网络由来 神经网…

ChatGPT指导如何完整写出研究论文的摘要

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 在学术写作中,学习如何为研究论文撰写简短且内容丰富的摘要非常重要。摘要可以让读者了解你的研究成果,快速浏览并决定是否要阅读更多内容。 但研究论文中的摘要…

Python面试宝典第23题:分发糖果

题目 n 个孩子站成一排,给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果。 (1)每个孩子至少分配到 1 个糖果。 (2)相邻两个孩子评分更高的孩子会获得更多的糖果。 请…

AI绘画SD万能模型 ControlNet Union (也称ControlNet++ 或 ControlNetPlus)!10余种控制效果一键生成!

大家好,我是画画的小强 Controlnet 可以说是目前最重要的一款 AI 绘画控制插件,可以帮我们实现轮廓、深度、动作姿势、颜色等多种控制效果。由于每种控制条件都需要调用不同的控制模型,加上 SD1.5 和 SDXL 的生态并不互通,大家肯…

【ROS 最简单教程 006/300】使用 launch 启动多个 ROS 节点

使用 launch 文件,可以一次性启动多个 ROS 节点 launch 文件编写的语法规则参见 👉 launch 文件编写 💜 💜 💜 💜 💜 简单示例如下 不使用 launch 需要启动三个命令行终端窗口,分别…

电商电子面单API对接方法

电商业务管理过程中,商家想要高效发货,使用电子面单是必不可少的,因为电子面单成本低、效率高,所以电商ERP、打单软件等这类应用对接电商电子面单API的需求量非常大。当应用通过电商电子面单API与电商平台、快递公司系统打通后&am…

Reranker技术

文章目录 Reranker技术0. 什么是RAG1. 什么是Reranker?2. Reranker在RAG技术中的应用3.使用 Reranker 的优缺点4.总结参考:知乎 Reranker技术 0. 什么是RAG 基础 RAG 的操作流程大致如下:首先,你需要将文本切分成小段&#xff0…

《深度RAG系列》 LLM 为什么选择了RAG

2023年是AIGC(Artificial Intelligence Generated Content)元年,这一年见证了人工智能生成内容领域的巨大飞跃,特别是大模型的爆发,它们在自然语言处理、图像生成、音频处理等多个领域展现出了惊人的能力。 这些预训练…

UVC驱动分析(一)

UVC驱动分析 UVC驱动简介Linux video框架分层UVC驱动注册UVC驱动注册入口函数UVC设备探测初始化UVC描述符解析V4L2设备注册UVC控制参数初始化UVC video驱动注册UVC 状态初始化 UVC驱动简介 UVC全称为USB Video Class,即:USB视频类,是一种为U…

Vue组件库移动端预览实现原理

引言 大家如果使用过移动端组件库(比如:Vant),会发现在网站右侧有一个手机端的预览效果。 而且这个手机端预览的内容和外面的组件代码演示是同步的,切换组件的时候,移动端预览的内容也会发生相应的变化。 …

基于python的百度迁徙迁入、迁出数据分析(四)

这篇文章是对上篇文章的可获取数据的时间区间的修正,依然通过开发者模式找寻相关数据源,我直接把数据url贴在这里,可以发现里面包含了相对明面上看不到的数据包括,行政区id、春运迁徙数据等:qianxi.cdn.bcebos.com/app…

LYT-Net——轻量级网络低光照条件图像修复模型推理部署(C++/Python)

1.环境安装 conda create -n LYT_Torch python3.9 -y conda activate LYT_Torchconda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidiapip install matplotlib scikit-learn scikit-image opencv-python yacs joblib natsort h5py tqdm tensor…

Conformal low power-7.运行Conformal Low Power 1801流程

要获取有关原生1801流程的最新信息(例如功能、指南、常见问题解答和dofile脚本),请使用SET WEB_INTERFACE ON命令启动Web界面。 左手边列出了所有的Conformal产品。还有一个名为“Sample Dofiles”的部分,提供了在不同场景下运行C…

第一个Python Web程序

1、离线安装Django 由于Python是3.7版本,Django选择2.2.4版本,并且中间需要安装依赖包。全部安装包如下: 打开Anaconda Prompt,先进入Python3.7环境,然后依次安装各个包: 至此,Django离线安装成功。 2、编写第一个Django程序 2.1 创建Django项目 创建项目welcome时…

C#初级——继承

继承 继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类(父类&#xff0…