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 @ 2020-04-19 18:24  古兰精  阅读(827)  评论(0编辑  收藏  举报