使用Node.js创建加密文件

使用Node.js构建加密文件的备忘录。

在制作批量转换工具时,使用sync类工具更易于处理。

由于Node的版本而具有或缺乏功能,所以确认环境可能会麻烦,但是不需要选择环境实在太好了。

请根据以下网址的内容进行参考:
https://nodejs.org/api/crypto.html

检查运行环境

    • macOS 10.12.3

 

    • npm -v 3.10.9

 

    node -v v7.2.0

将文件进行加密

function cipher(data, algorithm, password){
    var crypto = require("crypto");
    var cipher = crypto.createCipher(algorithm, password);
    return Buffer.concat([cipher.update(data), cipher.final()]);
}

var fs = require('fs');
var inData = fs.readFileSync(filepath);
var cipheredData = cipher(inData, 'aes-256-cbc', 'password');
fs.writeFileSync(filepath, cipheredData);

有很多算法可供选择,如aes-256-cbc和aes-256-ctr等等,
您可以通过以下方式来确认可用的选项。

console.log( crypto.getCiphers() );

尝试在篡改检测中加入HMAC。

function hmac(data, algorithm, password){
    var crypto = require("crypto");
    var hmac = crypto.createHmac(algorithm, password);
    hmac.update(data);
    return hmac.digest();
}

var fs = require('fs');
var inData = fs.readFileSync(filepath);
var hmacData = hmac(inData, 'sha256', 'password');

// ファイルデータの先頭にHMACを挿入
inData = Buffer.concat([hmacData, inData]);
// HMACを含めたファイルデータをまとめて暗号化
var cipheredData = cipher(inData, 'aes-256-cbc', 'password');

fs.writeFileSync(filepath, cipheredData);

我认为在HMAC的插入位置上,不管是在开头还是在末尾都可以,选择哪个更方便无关紧要。

通过选择不同的哈希函数,HMAC的大小会发生变化,但这次我们选择了sha256,因此大小为256位= 32字节。

如果要进行篡改检测,只需在使用端根据从第33个字节开始的数据生成HMAC,然后与1-32字节的数据进行比较即可。

试试压缩一下

不必担心数据大小的问题。
zlib.deflateSync 很方便。

var fs = require('fs');
var inData = fs.readFileSync(filepath);

var zlib = require('zlib');
var deflatedData = zlib.deflateSync(inData);

似乎先压缩再加密可以使数据大小更小,但加密强度会降低吧。。。

让我们尝试编译LUA。

顺便提一下。

https://www.npmjs.com/package/luac

var luac = require('luac');
luac.buildToFileSync(filepath, outFilePath);

尝试进行组合

创建带哈希值的加密压缩编译的lua数据文件,用于检测篡改。

var luac = require('luac');
luac.buildToFileSync(filepath, filepath);

var fs = require('fs');
var data = fs.readFileSync(filepath);

// 圧縮データにする
var zlib = require('zlib');
data = zlib.deflateSync(data);

// ファイルデータの先頭にHMACを挿入
var hmacData = hmac(data, 'sha256', 'password');
data = Buffer.concat([hmacData, data]);

// HMACを含めた圧縮ファイルデータをまとめて暗号化
data = cipher(data, 'aes-256-cbc', 'password');

fs.writeFileSync(filepath, data);
广告
将在 10 秒后关闭
bannerAds