三步实现Node.js文件加密:node-fs-extra与crypto模块的安全实践

三步实现Node.js文件加密:node-fs-extra与crypto模块的安全实践

【免费下载链接】node-fs-extra Node.js: extra methods for the fs object like copy(), remove(), mkdirs() 【免费下载链接】node-fs-extra 项目地址: https://gitcode.com/gh_mirrors/no/node-fs-extra

你还在为敏感文件暴露风险担忧?本文将通过node-fs-extra与crypto模块,实现一套完整的文件加密/解密方案。读完你将掌握:

核心模块准备

项目依赖架构
node-fs-extra提供文件系统增强能力,其核心API封装于lib/index.js,包含:

加密算法选型
采用Node.js内置crypto模块的AES-256-CBC模式,特点:

  • 对称加密效率高,适合大文件处理
  • 16字节IV向量确保相同明文加密结果不同
  • 支持流模式处理,避免内存溢出

实现步骤

1. 加密工具函数开发

创建crypto-utils.js实现核心加密逻辑:

const crypto = require('crypto');
const fs = require('fs-extra');

// 加密配置
const CONFIG = {
  algorithm: 'aes-256-cbc',
  key: crypto.scryptSync('your-32byte-key', 'salt', 32), // 32字节密钥
  ivLength: 16
};

// 加密文件
async function encryptFile(srcPath, destPath) {
  const iv = crypto.randomBytes(CONFIG.ivLength);
  const cipher = crypto.createCipheriv(CONFIG.algorithm, CONFIG.key, iv);
  
  // 确保目标目录存在
  await fs.ensureDir(fs.path.dirname(destPath));
  
  const input = fs.createReadStream(srcPath);
  const output = fs.createWriteStream(destPath);
  
  // 写入IV向量(前16字节)
  output.write(iv);
  
  return new Promise((resolve, reject) => {
    input.pipe(cipher).pipe(output)
      .on('finish', resolve)
      .on('error', reject);
  });
}

// 解密文件
async function decryptFile(encryptedPath, destPath) {
  const iv = await fs.readFile(encryptedPath, { length: CONFIG.ivLength });
  const decipher = crypto.createDecipheriv(CONFIG.algorithm, CONFIG.key, iv);
  
  const input = fs.createReadStream(encryptedPath, { start: CONFIG.ivLength });
  const output = fs.createWriteStream(destPath);
  
  return new Promise((resolve, reject) => {
    input.pipe(decipher).pipe(output)
      .on('finish', resolve)
      .on('error', reject);
  });
}

module.exports = { encryptFile, decryptFile };

2. 集成文件系统操作

利用lib/copy/copy.js的文件遍历能力,实现加密备份功能:

const { encryptFile } = require('./crypto-utils');
const fs = require('fs-extra');

async function encryptAndBackup(sourceDir, backupDir) {
  // 递归读取目录
  const entries = await fs.readdir(sourceDir, { withFileTypes: true });
  
  for (const entry of entries) {
    const srcPath = `${sourceDir}/${entry.name}`;
    const destPath = `${backupDir}/${entry.name}.enc`;
    
    if (entry.isDirectory()) {
      await encryptAndBackup(srcPath, destPath); // 递归处理子目录
    } else if (entry.isFile()) {
      await encryptFile(srcPath, destPath); // 加密文件
      console.log(`加密完成: ${destPath}`);
    }
  }
}

// 使用示例
encryptAndBackup('./sensitive-data', './encrypted-backup')
  .then(() => console.log('备份完成'))
  .catch(err => console.error('备份失败:', err));

3. 加密配置管理

使用lib/json/output-json.js存储加密元数据:

const fs = require('fs-extra');
const crypto = require('crypto');

async function saveEncryptionMeta(metaPath, fileMap) {
  const meta = {
    timestamp: new Date().toISOString(),
    checksum: crypto.createHash('sha256').update(JSON.stringify(fileMap)).digest('hex'),
    files: fileMap
  };
  
  await fs.outputJson(metaPath, meta, { spaces: 2 });
}

// 记录加密文件映射关系
saveEncryptionMeta('./encryption-meta.json', {
  'user-data.csv': 'user-data.csv.enc',
  'config.ini': 'config.ini.enc'
});

安全最佳实践

  1. 密钥管理

    • 生产环境避免硬编码密钥,可使用环境变量或密钥管理服务
    • 示例:process.env.ENCRYPTION_KEY加载密钥
  2. 完整性校验
    结合lib/fs/index.jsreadFile实现文件校验:

async function verifyFileIntegrity(filePath, expectedHash) {
  const data = await fs.readFile(filePath);
  const actualHash = crypto.createHash('sha256').update(data).digest('hex');
  return actualHash === expectedHash;
}
  1. 错误处理
    使用lib/util/async.js的异步控制流:
const { asyncIteratorConcurrentProcess } = require('./lib/util/async');

// 并发加密文件(限制5个并发)
async function batchEncrypt(files) {
  await asyncIteratorConcurrentProcess(files, async (file) => {
    await encryptFile(file.src, file.dest);
  }, { concurrency: 5 });
}

应用场景

官方文档:docs/
完整示例代码:test.js

通过这套方案,可在不影响原有文件操作流程的基础上,无缝集成加密能力,有效降低数据泄露风险。建议定期轮换加密密钥,并通过单元测试验证加密/解密一致性。

【免费下载链接】node-fs-extra Node.js: extra methods for the fs object like copy(), remove(), mkdirs() 【免费下载链接】node-fs-extra 项目地址: https://gitcode.com/gh_mirrors/no/node-fs-extra

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值