You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行main.js前解密依赖文件的可行性及内存式解密需求

Node.js加密依赖内存中解密加载方案

方案可行性

完全可行。Node.js支持自定义模块加载逻辑,我们可以通过拦截模块加载流程,在依赖文件被编译执行前完成解密,全程无需生成物理文件,直接在内存中处理。

改造实现(内存中解密加载)

你原来的代码是将解密内容写入本地文件,现在可以修改为通过拦截require的加载机制,直接在内存中解密并加载模块:

const fs = require('fs');
const crypto = require('crypto');
const path = require('path');
const Module = require('module');

const rootDirectory = './';
const encryptedDirectory = path.join(rootDirectory, 'Encrypted Files');
const encryptionKeyPath = path.join(rootDirectory, 'encryptionKey.txt');

// 加载加密密钥
const encryptionKey = fs.readFileSync(encryptionKeyPath);

// 备份Node.js默认的JS模块加载器
const originalJSLoader = Module._extensions['.js'];

// 自定义加密模块加载逻辑
Module._extensions['.js'] = function(module, filename) {
    // 判断当前加载的文件是否属于加密目录
    if (filename.startsWith(encryptedDirectory)) {
        // 读取加密文件内容
        const encryptedBuffer = fs.readFileSync(filename);
        // 提取存储在文件头部的IV(和加密时的逻辑对应)
        const iv = encryptedBuffer.slice(0, 16);
        const encryptedData = encryptedBuffer.slice(16);
        
        // 解密内容
        const decipher = crypto.createDecipheriv('aes-256-cbc', encryptionKey, iv);
        const decryptedBuffer = Buffer.concat([decipher.update(encryptedData), decipher.final()]);
        
        // 将解密后的内容编译为Node.js模块
        module._compile(decryptedBuffer.toString('utf8'), filename);
    } else {
        // 非加密文件使用默认加载逻辑
        originalJSLoader(module, filename);
    }
};

// ---------------------- 以下是你的main.js原有代码 ----------------------
// 现在可以直接require加密目录下的依赖,无需生成解密文件
// 例如:require('./Encrypted Files/your-dependency.js')

注意事项

  • 这段拦截逻辑必须放在main.js的最顶部,确保在任何require依赖语句之前执行
  • 如果你的依赖包含其他扩展名(如.json、.node),需要为对应扩展名添加类似的拦截逻辑
  • 密钥存储在本地文件存在安全风险,后续可以考虑使用环境变量或其他安全存储方式
  • 同步解密会阻塞Node.js启动进程,若依赖数量较多,可后续优化为异步解密模式

内容的提问来源于stack exchange,提问作者YoloQian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 18:44:17