JavaScript 環境で暗号機能を実行させたい場合に利用できる環境(ツール・ライブラリ等)です.
JavaScript は,本来 Webブラウザで解釈され実行されるクライアントサイドの言語ですが,Node.js を使うとローカルマシン上で JavaScript を実行できるようになります.これによりサーバーサイドの言語も JavaScript で書けるようになり,サーバ側,クライアント側ともに同じ言語で開発できるようになります.
以下,Node.js の基本的な使い方を示します.
node の基本的な使い方は,node コマンドに JavaScriptファイルを指定して実行するものです.
node [options] [-e "script" | script.js] [argmuments] node debug [-e "script" | script.js] [arguments]
Node.js 内のモジュールに暗号機能を持つ Crypto があります. Crypto は,OpenSSL のハッシュ関数,HMAC,暗号化・復号,署名生成・検証機能へのラッパーを提供しており,JavaScript から OpenSSLの暗号機能を利用できるようになります.
パスワードを使ってAES暗号で暗号化・復号するプログラム例を示します.
var crypto = require("crypto"); var plainText = 'This is a plain text'; console.log('\nPlain Text : ' + plainText); // using password var password = 'password'; // Encrypt var cipher = crypto.createCipher('aes-192-cbc', password); var encText = cipher.update(plainText, 'utf8', 'hex'); encText += cipher.final('hex'); console.log('Encrypt (AES-192-CBC) :'); console.log(encText); // Decrypt var decipher = crypto.createDecipher('aes-192-cbc', password); var decText = decipher.update(encText, 'hex', 'utf8'); decText += decipher.final('utf8'); console.log('Decrypt (AES-192-CBC) : '); console.log(decText + "\n");
CryptoJS は,JavaScript で実装された暗号機能を実現するモジュールです.(→ CryptoJS)
CryptoJS で利用できる主な暗号機能を紹介します.
var hash = CryptoJS.MD5("Message"); var hash = CryptoJS.SHA1("Message"); var hash = CryptoJS.SHA512("Message"); var hash = CryptoJS.SHA3("Message");ハッシュ関数の入力は,文字列または CryptoJS.lib.WordArrayオブジェクトです.WordArray は 32ビット語の配列であり,文字列を渡すと UTF-8エンコードされた WordArrayに変換される.出力は WordArray です.文字列のコンテキストにおいて WordArrayを用いると16進文字列に変換されます.
var sha256 = CryptoJS.algo.SHA256.create(); sha256.update("Message Part 1"); sha256.update("Message Part 2"); sha256.update("Message Part 3"); var hash = sha256.finalize();
var hash = CryptoJS.HmacMD5("Message", "Secret Passphrase"); var hash = CryptoJS.HmacSHA1("Message", "Secret Passphrase"); var hash = CryptoJS.HmacSHA256("Message", "Secret Passphrase"); var hash = CryptoJS.HmacSHA512("Message", "Secret Passphrase");
var salt = CryptoJS.lib.WordArray.random(128/8); var key256Bits = CryptoJS.PBKDF2("Secret Passphrase", salt, { keySize: 256/32 });
var enc = CryptoJS.AES.encrypt("Message", "Secret Passphrase"); var dec = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");鍵と初期ベクトル IV を指定して暗号化・復号する場合は,次のようになります.
var key = CryptoJS.enc.Hex.parse('000102030405060708090a0b0c0d0e0f'); var iv = CryptoJS.enc.Hex.parse('101112131415161718191a1b1c1d1e1f'); var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv });