AIRでパスワードを保存する時はEncryptedLocalStoreを使うべき
WebサービスにアクセスするAIRアプリを作成していると、ユーザーの利便性を考慮してWebサービスのユーザー名とパスワードを保存しておきたいと思う時があります。
そうした時のために、AIRにはEncryptedLocalStoreクラスが用意されています。このクラスはOS固有のデータ保護APIを使用してデータを保護する仕組みを提供しています。
このクラスを通して保存されたデータは、他のユーザーやアプリケーションが解釈できないように暗号化して保存されます。具体的には128 ビットの AES-CBC暗号 が使われています。
AES暗号のような共通鍵暗号を使う場合、アプリケーションに固定の鍵を組み込んでおくような実装をしがちですが、そういった実装だとアプリケーションを解析すれば鍵を取得出来るため、アプリケーションが保存しているWebサービスのユーザー名とパスワードを回収するような悪意のあるプログラムを作成することが可能になります。
せっかく暗号化しても暗号鍵が安全に保管されていなければ暗号化の意味がありません。ドアに鍵をかけたのに、鍵をさしっぱなしにしているようなものです。
この問題は、一般にキーマネージメントの問題として知られておりWindowsではDPAPI、MacではKeyChainを使う事で回避できます。EncryptedLocalStoreはこれらのAPIを使用しているので、AIRアプリでは基本的にEncryptedLocalStoreを使うべきです。
使い方も比較的簡単です。
import flash.data.EncryptedLocalStore; //データの保存 var passwordString:String = 'xxxxxx'; var bytes:ByteArray = new ByteArray(); bytes.writeUTFBytes(passwordString); EncryptedLocalStore.setItem('password', bytes); //データの取得 var storedValue:ByteArray = EncryptedLocalStore.getItem('password'); trace(storedValue.readUTFBytes(storedValue.length));
参考
- EncryptedLocalStore
- AES暗号
- DPAPI(データ保護API)のトラブルシューティング - DPAPIの概要がわかります
- as3crypto - AESなど暗号化アルゴリズムをAS3で使うためのライブラリです