アプリケーション開発ポータルサイト
ServerNote.NET
ServerNote.NET厳選キャンペーン・クーポンはこちら!
カテゴリー【Node.jsJavaScript
【Node.js】文字列を後から復元できる可逆の暗号化にかける
POSTED BY
2023-01-12

暗号化には2種類あり、暗号化後の文字列から復号(復元)できるもの=可逆、復元はできないもの=非可逆がある。

可逆の暗号化アルゴリズムとしてよく使われるものにAES-256-CBCで、キー文字列・キーバイナリ・対象文字列を与えれば、1つの暗号化文字列を生成してくれる(可逆なのでサイズは対象文字列の長さによる)。
また、キー文字列とキーバイナリがわかれば、暗号化文字列から復号化してくれる。

Node.jsでこれを行うには、cryptoモジュールを利用する。

npm install crypto

ランダムに生成したキー文字列とキーバイナリを内部保存しておき、それを使って対象文字列の暗号化・復号化を行うサンプルが以下。

JavaScriptaes-256-cbc.jsGitHub Source
var crypto = require('crypto');

//現在日時をミリ秒単位で文字列化して返す
function get_time_string() {
  var date = new Date();
  return date.getFullYear() +
  ('0' + (date.getMonth() + 1)).slice(-2) +
  ('0' + date.getDate()).slice(-2) +
  ('0' + date.getHours()).slice(-2) +
  ('0' + date.getMinutes()).slice(-2) +
  ('0' + date.getSeconds()).slice(-2) +
  ('00' + date.getMilliseconds()).slice(-3);
}

//対象文字列
var target_string = 'あいうえおかきくけこ';
console.log('target_string=' + target_string);

//文字列キーの生成
var string_key = "KEY" + get_time_string();
console.log('string_key=' + string_key);

//バイナリキーの生成
var binary_key = crypto.randomBytes(16);
var binary_key_b64 = binary_key.toString('base64');
console.log('binary_key_b64=' + binary_key_b64);

//文字列キーをmd5化しバイナリキーと合わせてAES-256-CBC暗号化&base64化
var md5 = crypto.createHash('md5');
var string_key_md5 = md5.update(string_key, 'binary').digest('hex');
console.log('string_key_md5=' + string_key_md5);
var cipher = crypto.createCipheriv('aes-256-cbc', string_key_md5, binary_key);
var encrypted = cipher.update(target_string, 'utf8', 'base64') + cipher.final('base64');
console.log('encrypted=' + encrypted);

//文字列キーとバイナリキーから暗号化文字列をAES-256-CBC復号化する
var decipher = crypto.createDecipheriv('aes-256-cbc', string_key_md5, Buffer.from(binary_key_b64, 'base64'));
var decrypted = decipher.update(encrypted, 'base64', 'utf8') + decipher.final('utf8');
console.log('decrypted=' + decrypted);

実行結果

node aes-256-cbc.js

target_string=あいうえおかきくけこ
string_key=KEY20230112212224623
binary_key_b64=WMGCW7ZtkBEJSekujObWeQ==
string_key_md5=3ca4ca9231b95bc09febbd8ad9fe5609
encrypted=4xprEAChcl3Ko+LfZmlpemRmJu6Lh7GHWhWh49+Z0Jw=
decrypted=あいうえおかきくけこ

Buffer.from(binary_key_b64, 'base64')のところはもちろんbinary_keyで構わない。base64文字列からバイナリデータを生成するBuffer.fromの使い方としてメモ的にそうしてます。

ギムネマ&サラシアを黄金比で高純度・高濃度配合!【ザ・糖質スーパープレミアムダイエット】
糖質制限サポート2大成分「ギムネマ」と「サラシア」の配合量を 原料・純度はそのままに従来品より増量致し...READ MORE
雑誌でも話題!美容室・サロンシェアNo,1ブランドNobbyから誕生した【Nobby by T ESCOM】
◆あの、Nobby(ノビー)が作ったホームケアシリーズ◆ 国内約70%の美容室で使われているサロンシェアNO.1ブ...READ MORE
保険相談をもっと身近に保険コネクト
保険コネクトは保険の相談をしたい方と、全国の保険販売資格者 or FPをマッチングさせるサービスです。知人...READ MORE
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【webmaster/管理人】
自営業プログラマー
ご連絡は以下アドレスまで★

☆ServerNote.NETショッピング↓
ShoppingNote
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】