使用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);