木木困玉光

Hexo_js混淆


Tags: #Hexo
Created:
Updated:

参考资料

前言

混淆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进行混淆

image-20241116184456902

效果图:

image-20241116185541482

本地版

刚开始没有想要做插件,想的是本地脚本执行,所以做了本地的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);
:D 获取中...