zoukankan      html  css  js  c++  java
  • 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裁剪的地方

  • 相关阅读:
    AutoLayout动画
    实现毛玻璃效果
    合并静态库
    GCDAsyncSocket~
    iOS下URL编码
    OC多线程之GCD ----- 2
    堆和栈的区别
    Effective Objective-C 2.0重读笔记---2
    Android手机端抓包方法
    Android APK反编译
  • 原文地址:https://www.cnblogs.com/goloving/p/12732749.html
Copyright © 2011-2022 走看看