Help us understand the problem. What is going on with this article?

nodejsで暗号ファイルを作る

More than 3 years have passed since last update.

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

algorithmは、aes-256-cbcaes-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にしてみたのでサイズは 256bit = 32byte

改ざん検出をする場合は、使用側で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);
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした