カテゴリー【Node.js、JavaScript】
【Node.js】文字列を後から復元できる可逆の暗号化にかける
POSTED BY
2023-01-12
2023-01-12


暗号化には2種類あり、暗号化後の文字列から復号(復元)できるもの=可逆、復元はできないもの=非可逆がある。
可逆の暗号化アルゴリズムとしてよく使われるものにAES-256-CBCで、キー文字列・キーバイナリ・対象文字列を与えれば、1つの暗号化文字列を生成してくれる(可逆なのでサイズは対象文字列の長さによる)。
また、キー文字列とキーバイナリがわかれば、暗号化文字列から復号化してくれる。
Node.jsでこれを行うには、cryptoモジュールを利用する。
npm install crypto
ランダムに生成したキー文字列とキーバイナリを内部保存しておき、それを使って対象文字列の暗号化・復号化を行うサンプルが以下。
JavaScript | aes-256-cbc.js | GitHub 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】
Android
iPhone/iPad
Flutter
MacOS
Windows
Debian
Ubuntu
CentOS
FreeBSD
RaspberryPI
HTML/CSS
C/C++
PHP
Java
JavaScript
Node.js
Swift
Python
Amazon/AWS
CORESERVER
Google
仮想通貨
LINE
IBM Watson
Microsoft Azure
Xcode
VMware
MySQL
PostgreSQL
Redis
Groonga
Git/GitHub
Apache
nginx
Postfix
SendGrid
Hackintosh
Hardware
Fate/Grand Order
ウマ娘
将棋
※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
※本記事内容の無断転載を禁じます。
【キーワード検索】
【まんが王国】★お得感No.1★国内最大級の電子コミックサイト
月28,000本もの販売実績有り!今話題の健康オイル【仙台勝山館MCTオイル】
トレンド韓国雑貨SHOP 「#ていねいな暮らし」
安心のダビング実績150万本!業界最安値【想い出ビデオDVDダビング工房】
手の届く高級感。バッグ・小物のオリジナルブランド【Kiefer neu(キーファーノイ)】
あなたのフライパン焦げ付きませんか?王様フライパンPENTAは革命的です!
NTTPCのおすすめレンタルサーバーはこちら
【塗ってすぐパッチリ目!!】上まぶた専用商品『リッドキララ』
人気急上昇中ギフト専門セレクトショップ「TANP」
家事代行スタッフ登録!お財布と心が笑顔になるクラウド家事代行サービス【CaSy】

月28,000本もの販売実績有り!今話題の健康オイル【仙台勝山館MCTオイル】

トレンド韓国雑貨SHOP 「#ていねいな暮らし」

安心のダビング実績150万本!業界最安値【想い出ビデオDVDダビング工房】

手の届く高級感。バッグ・小物のオリジナルブランド【Kiefer neu(キーファーノイ)】

あなたのフライパン焦げ付きませんか?王様フライパンPENTAは革命的です!

NTTPCのおすすめレンタルサーバーはこちら

【塗ってすぐパッチリ目!!】上まぶた専用商品『リッドキララ』

人気急上昇中ギフト専門セレクトショップ「TANP」

家事代行スタッフ登録!お財布と心が笑顔になるクラウド家事代行サービス【CaSy】

【最近の記事】【全部の記事】
PowerPointでテキストを左右反転するにはオンボードグラフィックスと外付けビデオカードを同時利用してデュアルディスプレイにする
EaseUS RecExpertsで画面を録画する
【MySQL】テーブル定義を確認してインデックスを操作する【MariaDB】
通常のC言語配列にstd::for_each,find_if等のC++ラムダ式ループを適用する
【C/C++】処理系に依存しない64ビットフラグ演算集【保存版】
【C++】2つのvector配列を比較して両方に共通する要素を取り出す【set_intersection】
【Node.js】ビットコイン(BTC)およびイーサリアム(ETH)の日本円(JPY)レートを取得する
【Node.js】BTC←→SATOSHIおよびETH←→WEIの相互変換を行う
【Node.js】文字列を後から復元できる可逆の暗号化にかける
【人気の記事】【全部の記事】
進研ゼミチャレンジタッチをAndroid端末化する【Windows10】リモートデスクトップ間のコピー&ペーストができなくなった場合の対処法
Googleスプレッドシートを編集したら自動で更新日時を入れる
Googleスプレッドシートで図形をコピーして使いまわすには
【Javascript】JSON配列内にある特定要素の取得法【Node.js】
Windows版Google Driveが使用中と言われアンインストールできない場合
Googleファミリーリンクで子供の端末の現在地がエラーで取得できない場合
【Linux共通】プロキシサーバーの利用設定
Androidホームで左にスワイプすると出てくるニュース共を一切表示させない方法
Ubuntuで固定IPアドレスを使う設定をする
【カテゴリーリンク】
Android
iPhone/iPad
Flutter
MacOS
Windows
Debian
Ubuntu
CentOS
FreeBSD
RaspberryPI
HTML/CSS
C/C++
PHP
Java
JavaScript
Node.js
Swift
Python
Amazon/AWS
CORESERVER
Google
仮想通貨
LINE
IBM Watson
Microsoft Azure
Xcode
VMware
MySQL
PostgreSQL
Redis
Groonga
Git/GitHub
Apache
nginx
Postfix
SendGrid
Hackintosh
Hardware
Fate/Grand Order
ウマ娘
将棋