メモログ

CryptoJSを使ったクライアントとサーバー間の暗号化と復号化

CryptoJS を使ったクライアントサイド(Javascript)とサーバーサイド(Node.js)での暗号化と復号化について。CryptoJS はbrix/crypto-jsのやつを使用します。

クライアントサイドの実装

CryptoJS のライブラリ(crypto-js.js)を head で読み込ませているとします。

var str = "Lorem ipsum dolor sit amet";
var key = "12345678901234567890123456789012";
var encrypted = CryptoJS.AES.encrypt(str, key);
console.log(encrypted.toString());

encrypt メソッドで生成した変数を toString()すると、ciphertext や iv、salt など復号化に必要なものをまとめて一つの Base64 フォーマットの文字列に変換してくれます。これを Node.js 側に送ります。

サーバーサイドの実装

var CryptoJS = require("crypto-js");
var str = "U2FsdGVkX19c2KuWxFQsC9fhaum9z8w6MtoMikCmy0Om+Mi+cAEEFu7JZl8JLOf3";
var key = "12345678901234567890123456789012";
var decrypted = CryptoJS.AES.decrypt(str, key);
console.log(decrypted.toString(CryptoJS.enc.Utf8));

という感じで、CryptoJS を使うと簡単に暗号化と復号化ができます。ただ、クライアントサイドのソースは公開されてしまうので、クライントサイドとサーバーサイドでどう key を共有するかというのが考えどころ(ajax で取得するようにするとか?)。また、key は salting した上で使うらしいので([JavaScript]CryptoJS で AES 暗号の salt とパスフレーズから key を求める - Qiita参照)、他の暗号化/復号化ライブラリと連携して使おうとすると、実際使われている key がわからなくて難儀するかもなあと思いました。

私について

Yutaka Yamaguchi
東京在住。TypeScript, Node.js, Reactなどフロンエンドが主力。Perlも書く。SwiftやRubyも過去には使ってた。過去のTOEIC 860くらい。