WebPack插件实现:打包之后自动混淆加密JS文件

在WebPack中调用JShaman,实现对编译打包生成的JS文件混淆加密

一、插件实现

1、插件JShamanObfuscatorPlugin.js,代码:

class JShamanObfuscatorPlugin {
apply(compiler) {
compiler.hooks.emit.tapAsync('JShamanObfuscatorPlugin', (compilation, callback) => {
Object.keys(compilation.assets).forEach((fileName) => {
// 检查文件名是否以.js结尾
if (fileName.endsWith('.js')) {
const asset = compilation.assets[fileName];
const input = asset.source();

try {

var obfuscatedCode = input;

/**
* JShaman配置部分
*/
//JShaman.com VIP码,免费使用设为"free",如已购买VIP码,在此修改
const vip_code = "free";
//混淆加密参数配置,免费使用时无需配置
//参数详细说明请参见JShaman官网,设为"true"启用功能、设为"false"不启用
const config = {
//压缩代码
compact: "true",
//混淆全局变量名和函数名
renameGlobalFunctionVariable: "false",
//平展控制流
controlFlowFlattening: "true",
//僵尸代码植入
deadCodeInjection: "false",
//字符串阵列化
stringArray: "true",
//阵列字符串加密
stringArrayEncoding: "false",
//禁用命令行输出
disableConsoleOutput: "false",
//反浏览器调试
debugProtection: "false",
//时间限定
time_range: "false",
//时间限定起始时间、结束时间,时间限定启用时此2参数生效
time_start: "20240118",
time_end: "20240118",
//域名锁定
domainLock: [],
//保留关键字
reservedNames: [],
}
/**
* 以下代码实现向JShaman.com WebApi发送请求完成JavaScript混淆加密
*/
const request = require("sync-request");
//使用free为VIP码、免费调用JShaman WebAPI接口时,不能配置参数,仅可实现较低强度代码保护
//如果购买了JShaman的VIP码,则可启用配置,实现高强度JavaScript混淆加密
var json_options = {
json: {
//JavaScript代码
"js_code": input,
//JShaman VIP码
"vip_code": vip_code,
}
}
if(vip_code != "free"){
//混淆加密参数
json_options.json.config = config;
console.log(config);
}
console.log("正在向JShaman.com提交混淆加密请求...")
//发送请求到JShaman服务器,进行JavaScript混淆加密
var res = request("POST", "https://www.jshaman.com:4430/submit_js_code/", json_options);
var json_res = JSON.parse(res.getBody('utf8'));
//返回状态值为0是成功标识
if(json_res.status == 0){

//输出返回消息
console.log(json_res.message);

obfuscatedCode = json_res.content.toString();

} else {
console.error("向JShaman.com发送请求时出现错误:", json_res, "混淆加密失败...");
}
// 更新compilation.assets中的文件内容为混淆后的代码
compilation.assets[fileName] = {
source: () => obfuscatedCode,
size: () => obfuscatedCode.length,
};

} catch (error) {
console.error(error);
// 在这里可以决定如何处理错误,比如跳过当前文件或抛出异常
}
}
});

// 调用callback以通知Webpack插件处理完成
callback();
});
}
}
module.exports = JShamanObfuscatorPlugin;

2、webpack.config.js配置代码:

const path = require('path');
const JShamanObfuscatorPlugin = require('./JShamanObfuscatorPlugin');
module.exports = {
entry: './example.js',
plugins: [
new JShamanObfuscatorPlugin(),
],
output: {
path: path.resolve(__dirname, ''),
filename: 'bundle.js',
},
};

二、功能测试

Example.js,代码:

var mod = require("./mod.js");
mod.fun();
console.log("done.");

Mod.js,代码:

exports.fun = function (){
var name = "Tom"
var age = 100;
console.log(name + " is " + age + " years old.");
}

Webpack编译:

生成的bundle.js,其中的js代码已被混淆加密:

而如果未使用此插件,生成的bundle.js代码如下:

<think>嗯,用户问的是Webpack打包生成的JS是否属于混淆加密,还有混淆加密的区别。首先,我需要理解用户的问题。他们可能在使用Webpack打包项目时,注意到生成的代码看起来比较混乱,可能误以为这是混淆加密。需要明确这两者的不同。 首先,Webpack打包后的代码确实会有模块化的结构,变量可能被缩短,代码结构变得紧凑。但这主要是打包过程中的优化,比如作用域提升、代码压缩等,属于打包工具的正常处理,并不等同于专门的混淆加密。 接下来,混淆加密的区别。混淆主要是让代码难以阅读和理解,但功能不变,比如变量重命名、控制流扁平化。而加密通常指将代码转换成不可逆的形式,需要密钥才能还原,比如AES加密。但JS代码如果加密,运行时必须解密,可能影响性能,所以实际中混淆更常见。 然后,用户提供的引用资料中提到Webpack结合插件webpack-obfuscator可以实现混淆加密。这说明Webpack本身不包含混淆加密功能,但可以通过插件扩展。例如引用[3]和[4]提到配置插件实现打包自动混淆,而混淆选项如selfDefending属于混淆技术。 需要澄清的是,Webpack默认的打包结果不属于加密,可能包含一些混淆效果,但程度有限。真正的混淆需要专门配置插件,而加密可能需要其他工具。用户可能混淆了这两个概念,需要明确区分。 另外,用户可能关心如何保护他们的JS代码,所以需要说明Webpack打包本身不足以提供强保护,必须借助额外插件。同时,混淆加密的选择取决于需求,混淆更常用,加密可能影响执行效率。 最后,总结回答时要结构清晰,分点说明Webpack打包结果的性质,混淆加密的区别,以及如何通过插件增强保护。确保引用提供的资料作为支持,比如引用[2]和[3]提到的插件实例。</think>### Webpack打包生成的JS是否属于混淆加密? #### 1. **Webpack打包生成的JS文件性质** Webpack默认生成的JS文件属于**代码打包优化**,但**不属于严格意义的混淆加密**。其核心目标是模块化管理和资源优化: - **模块化处理**:将多个文件合并为少数文件,通过`eval`或闭包实现作用域隔离。 - **变量缩短**:通过`TerserPlugin`等工具缩短变量名(如`a`、`b`),但逻辑仍可逆向分析[^2][^3]。 - **代码压缩**:移除空格、注释,优化语法结构,但未添加混淆加密层[^4]。 #### 2. **混淆加密的核心区别** | **特性** | **混淆** | **加密** | |-----------------|-----------------------------------|-----------------------------------| | **目的** | 增加代码阅读难度 | 完全阻止未授权访问 | | **技术手段** | 变量重命名、控制流扁平化、字符串编码 | AES、RSA等算法转换 | | **可逆性** | 可逆向(需工具辅助) | 需密钥解密 | | **典型工具** | `webpack-obfuscator`、JShaman | 前端加密库(如CryptoJS) | | **对性能影响** | 较小 | 可能较大(解密过程) | #### 3. **Webpack实现混淆加密的方法** 若需实现真正的混淆加密,需通过插件扩展: - **混淆插件**:例如`webpack-obfuscator`,支持控制流扁平化、字符串加密、僵尸代码注入等[^1][^3]。 ```javascript // webpack.config.js 配置示例 const JavaScriptObfuscator = require('webpack-obfuscator'); module.exports = { plugins: [ new JavaScriptObfuscator({ rotateStringArray: true, selfDefending: true // 防止格式化攻击[^4] }) ] }; ``` - **加密插件**:部分工具(如JShaman)可对JS代码进行加密,但需注意浏览器执行时需解密逻辑[^3]。 #### 4. **实际应用建议** - **基础保护**:Webpack默认压缩足够应对简单场景。 - **商业级保护**:结合混淆插件(如`selfDefending`模式)防止代码调试。 - **敏感逻辑**:关键算法建议后端实现前端加密仅作为辅助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值