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裁剪的地方