Hexo_js混淆
参考资料
javascript-obfuscator
Hexo
- Hexo - 插件:插件文件结构介绍
- hexo-插件开发实例:很详细的开发教程
- Hexo - 过滤器(Filter):Hexo渲染流程,决定如何介入
- hexo 教程之为 hexo 编写一个插件:编写插件教程
npm
- npm:官网,注册账户,发布包使用
前言
混淆js
这块找了一圈没有发现整合到hexo
渲染流程中的混淆插件,手动复制一个个js
去在线网站混淆感觉非常麻烦
我想要的效果是类似于hexo-all-minifier
(压缩插件),执行hexo-g
会在渲染的时候自动执行
后续改变思路,寻找可以混淆的库,找到javascript-obfuscator
,跟hexo
功能稍微组合下,做了一个插件,包已经发布,可以直接安装
目前第一版没啥可以设置,凑合着用吧😑
使用方法
安装
$ npm install hexo-obfuscate --save
站点配置_config.yml
添加配置
hexo_obfuscate:
enable: true
exclude:
- fancybox.umd.js
- highlight.min.js
- waline.js
exclude
:需要排除的js
,默认会排除所有.min.js
- 注:像一些依赖库完全没有必要混淆,增加不必要的体积,减低网站访问速度
配置后,在执行hexo -g
的时候会自动对js
进行混淆
效果图:
本地版
刚开始没有想要做插件,想的是本地脚本执行,所以做了本地的js
,留个纪念吧
可以适用于不是Hexo
框架的小伙伴,需要有nodejs
环境
先安装下"javascript-obfuscator"
包
npm install -g javascript-obfuscator
下面的代码保存obfuscateJs.js
修改6行为修改执行批量混淆的目录路径
修改9行为需要排除的js
const fs = require("fs");
const path = require("path");
const JavaScriptObfuscator = require("javascript-obfuscator");
// 目录路径
const publicDir = path.join(__dirname, "./public/js");
// 需要排除的文件或目录的路径数组
const excludeList = ["fancybox.umd.js", "highlight.min.js", "waline.js"];
function isExcluded(filePath) {
return excludeList.some((exclude) => filePath.includes(exclude));
}
function obfuscateJs(fileContent) {
const obfuscationResult = JavaScriptObfuscator.obfuscate(fileContent, {
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 1,
numbersToExpressions: true,
simplify: true,
stringArray: true,
stringArrayEncoding: ["rc4"],
stringArrayThreshold: 1,
deadCodeInjection: true,
deadCodeInjectionThreshold: 0.4,
selfDefending: true,
unicodeEscapeSequence: true,
});
return obfuscationResult.getObfuscatedCode();
}
function traverseAndObfuscate(directory) {
fs.readdirSync(directory).forEach((file) => {
const filePath = path.join(directory, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
if (!isExcluded(filePath)) {
traverseAndObfuscate(filePath);
}
} else if (
stats.isFile() &&
file.endsWith(".js") &&
!isExcluded(filePath)
) {
const fileContent = fs.readFileSync(filePath, "utf8");
const obfuscatedContent = obfuscateJs(fileContent);
fs.writeFileSync(filePath, obfuscatedContent, "utf8");
console.log(`Obfuscated: ${filePath}`);
}
});
}
traverseAndObfuscate(publicDir);