nodejs向加密文件指定位置插入内容

一、需求:

  文件加密,将加密密钥之类的东西放在加密文件之前,类似于给文件增加一个头部信息,在解密的时候从文件这个头部信息里拿到这些密钥之类的东西,请求获取解密的code之类的东西,然后解密加密的文件。比如下

二、问题:

  不能向文件的指定位置插入内容,如果直接将文件记录指针移动到中间某位置后开始输出,则新输出的内容会覆盖文件中原有的内容,如果需要向指定位置插入内容,程序需要先把插入点后面的内容读入缓冲区,等把需要插入的数据写入文件后,再将缓冲区的内容追加到文件后面。

  解决方案及插入步骤:

  1、创建临时文件,保存被插入文件的插入点后面的内容;

  2、再重新定位到插入点,将需要插入的内容添加到文件后面;

  3、最后将临时文件的内容添加到文件后面。

  下面是一个简单的demo

复制代码
const crypto = require('crypto')
const fs = require('fs')
const path = require('path')
let key = '54F0853FD5D8D2FD61CE33309B0D0273'
let iv = 'A19820BCE43576DF'

function aesEncryptNew (buff, key, iv) {
  let cipher = crypto.createCipheriv('aes-256-cbc', key, iv)
  return cipher.update(buff, '', 'hex')
}
function aesDecryptNew (buff, key, iv) {
  let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv)
  return decipher.update(buff, 'hex')
}

function encryptFile (filepath, filename) {
  let _path = path.join(filepath, filename)
  let buff = fs.readFileSync(_path)
  let buffEnc = aesEncryptNew(buff, key, iv)
  let _newPath = _path + '.mc'// 创建一个可以写入的流,写入到文件 output.txt 中
  var writerStream = fs.createWriteStream(_newPath)
  // 使用 utf8 编码写入数据
  writerStream.write(key, 'utf8')
  writerStream.write(Buffer.from(buffEnc, 'hex'), 'hex')
  // 标记文件末尾
  writerStream.end()
  // 处理流事件 --> data, end, and error
  writerStream.on('finish', function () {
    console.log('写入完成。')
  })
}

function decryptFile (filepath, filename) {
  let _path = path.join(filepath, filename)
  let hexContent = fs.readFileSync(_path)
  let bufferFile = hexContent.slice(32, hexContent.length)
  let deHex = aesDecryptNew(bufferFile, key, iv)
  let _newPath = _path.replace(/.mc/g, '')
  fs.writeFileSync(_newPath, Buffer.from(deHex, 'hex'))
}

export {
  encryptFile,
  decryptFile
}
复制代码

  需要注意的是:

  1、先写入标识key,再写入加密内容的地方

  2、文件裁剪,需要使用buffer裁剪的地方

posted @   古兰精  阅读(854)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2018-04-19 ElementUI使用问题记录:设置路由+iconfont图标+自定义表单验证
点击右上角即可分享
微信分享提示