Titaniumでデータを安全に保存する場合、iOSならKeychainを使う手がありますが、クロスプラットフォームでの開発で双方向暗号化をうまく実装する方法は提供されていません。
もっとも、そんなものはクロスプラットフォームの開発を前提にする以上は誰も提供していませんが。
JavaやObj-Cで書いたモジュールを使うという手もありますが、プラットフォーム間での動作の違いがあると面倒なので、できればJSで解決したいものです。
そこで、ForgeやCryptoJSといったものが候補に上がってくるかと思います。
Forgeはcrypto-jsの開発が停滞したため作者がこっちの方がいいよと推薦しているプロジェクトで、ブラウザとNode.jsのどちらでも動作するようになっています。
しかし、残念なことにTitaniumではNodeのモジュールはそのまま動作させることができませんでした。相互依存しているutil.jsに互換性がないのが痛いですね。またマルチバイト文字列でAESを扱う際に面倒なことが多そうなので諦めました。BrowserifyをもじったTitaniumifyプロジェクトもあるそうなので、そちらの未来に期待しましょう。
そこで、今回はCryptoJSを使って、AESを利用した双方向暗号を使ってみましょう。NSAに覗かれないように別のがいいといった声なき声を平気で無視できるのが非対話式ドキュメントの便利なところですね。
CryptoJSの場合、AESならaes.jsを単体で組み込んでしまえば動作するようになっています。ただ、CommonJSの形式で使うには少し工夫が必要です。
まずはminifyされたバージョンを取得してます。
http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js
こちらのファイルをapp/assets/直下(またはapp/lib/直下)に設置します。そして、ファイルの一番下に以下の行を追記します。
module.exports = CryptoJS;
これでCommonJS形式で使えるようになりました。
var CryptoJS = require('aes');
var str = "桃、桃、桃";
var enc = CryptoJS.AES.encrypt(str, "Secret Passphrase");
Ti.API.info(enc.toString());
var dec = CryptoJS.AES.decrypt(enc.toString(), "Secret Passphrase");
Ti.API.info(dec.toString(CryptoJS.enc.Utf8));
エンコードされたオブジェクトencをtoStringするとbase64エンコードされた文字列が、デコードされたオブジェクトをtoString()したら「桃、桃、桃」と出力されましたね。実行するたびにsaltの値が変化するので、base64の結果は毎度違ったものになるはずです(じゃないと推測されちゃいますよね)。
enc.toString()の結果をどこかに保存しておけば、上のやり方でいつでもデコードできます。