暗号化されたローカルストア

EncryptedLocalStore クラス(ELS)は、暗号化されたローカル記憶領域のメカニズムを提供します。このメカニズムは、アプリケーションのプライベートデータ用の小規模なキャッシュとして使用できます。ELS のデータはアプリケーション間で共有できません。ELS の目的は、ログイン資格情報や他の個人情報などの再作成されたアイテムをアプリケーションで簡単に格納できるようにすることです。ELS のデータは、以下の「暗号化されたローカルストアの制限事項」および「ベストプラクティス」で説明されているように、永続的なデータとしては扱わないでください。

注意: 暗号化されたローカルストアが用意されているだけでなく、AIR は、SQL データベースに格納されたコンテンツの暗号化も提供します。詳しくは、 SQL データベースでの暗号化の使用 を参照してください。

Web サービスに対するログイン資格情報など、セキュリティで保護する必要がある情報をキャッシュするために暗号化されたローカルストアを使用する必要がある場合があります。他のユーザーに対して非公開にする必要がある情報を保存するには、ELS が適切です。ただし、ELS では同じユーザーアカウントで実行される他のプロセスからデータを保護することはできません。このため、DRM や暗号化キーなどの機密アプリケーションデータを保護するには適切でありません。

デスクトッププラットフォームにおいて、AIR では、Windows は DPAPI、Mac OS は KeyChain、Linux は KeyRing または KWallet を使用して、暗号化されたローカルストアを各アプリケーションおよびユーザーに関連付けます。暗号化されたローカルストアは AES-CBC 128 ビット暗号化を使用します。

Android では、EncryptedLocalStorage クラスによって保存されたデータは暗号化されません。代わりに、データはオペレーティングシステムに用意されているユーザーレベルのセキュリティによって保護されます。Android オペレーティングシステムはすべてのアプリケーションに個別のユーザー ID を割り当てます。アプリケーションがアクセスできるのは、自身のファイルと、パブリックロケーション(リムーバブルストレージカードなど)で作成されたファイルだけです。「ルート化された」Android デバイス上では、ルート権限で実行しているアプリケーションは、他のアプリケーションのファイルにアクセス可能です。したがって、ルート化されたデバイスでは、ルート化されていないデバイスで確保される暗号化されたローカルストアの高いデータ保護レベルが実現されません。

暗号化されたローカルストア内の情報は、アプリケーションセキュリティサンドボックス内の AIR アプリケーションコンテンツでのみ使用できます。

AIR アプリケーションを更新すると、更新されたバージョンには暗号化されたローカルストアの既存のデータへのアクセス権が保持されます。ただし、次の場合を除きます。

  • stronglyBound パラメーターを true に設定してアイテムが追加された場合。

  • 既存バージョンと更新バージョンが両方とも AIR 1.5.3 以前にパブリッシュされていて、更新が移行署名で署名されている場合。

暗号化されたローカルストアの制限事項

暗号化されたローカルストアのデータは、ユーザーのオペレーティングシステムアカウントの資格情報で保護されています。他のエンティティは、そのユーザーとしてログインできる場合を除き、ストア内のデータにアクセスできません。ただし、認証されたユーザーによって実行される他のアプリケーションからのアクセスに対しては、データのセキュリティは保護されません。

このような攻撃を機能させるにはユーザーが認証される必要があるので、ユーザーのプライベートデータは保護されます(ユーザーアカウント自体が偽装されない限り)。ただし、ライセンスやデジタル権限管理用のキーなど、アプリケーションでユーザーに公開しない可能性のあるデータは、保護されません。したがって、ELS はそのような情報を格納するのに適切な場所ではありません。ELS は、パスワードなどのユーザーのプライベートデータを保存する目的にのみ適しています。

ELS 内のデータは、様々な理由で失われる場合があります。例えば、ユーザーがアプリケーションをアンインストールしたり、暗号化されたデータを削除したりする場合があります。また、更新の結果、発行者 ID が変更される場合があります。このように、ELS は永続的なデータ記憶領域ではなく、プライベートキャッシュとして扱う必要があります。

stronglyBound パラメーターはサポートされなくなったため、 true に設定しないでください。このパラメーターを true に設定しても、追加のデータ保護は提供されません。同時に、発行者 ID が同じでもアプリケーションが更新されるとデータへのアクセスが失われます。

格納されたデータが 10MB を超えると、暗号化されたローカルストアの処理が遅くなる場合があります。

AIR アプリケーションをアンインストールするときは、アンインストーラーは暗号化されたローカルストアに格納されたデータを削除しません。

ベストプラクティス

ELS を使用するためのベストプラクティスには次のようなものがあります。

  • パスワードなどのユーザーの機密データを保存する目的で ELS を使用します(stronglyBound を false に設定)。

  • DRM キーやライセンスのトークンなどのアプリケーションの機密情報を保存する目的では ELS を使用しないでください。

  • ELS データが失われた場合に、ELS に保存されたデータをアプリケーションで作成し直す方法を提供します。例えば、必要に応じて、ユーザーにアカウント資格情報の再入力を求めます。

  • stronglyBound パラメーターは使用しないでください。

  • stronglyBound true に設定する場合は、更新中に保存されたアイテムを移行しないでください。代わりに、更新後にデータを再作成します。

  • 比較的少量のデータのみ保存します。それより大きな量のデータに対しては、暗号化を適用した AIR SQL データベースを使用します。

暗号化されたローカルストアへのデータの追加

EncryptedLocalStore クラスの setItem() 静的メソッドを使用して、データをローカルストアに格納します。データは、ストリングをキーとして使用し、バイト配列として格納されたデータと共に、ハッシュテーブルに格納されます。

例えば、次のコードは暗号化されたローカルストアにストリングを格納します。

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes);

setItem() メソッドの 3 番目のパラメーターである stronglyBound パラメーターはオプションです。このパラメーターを true に設定すると、暗号化されたローカルストアは、格納している AIR アプリケーションのデジタル署名とビット列に、格納されたアイテムをバインドします。

var str:String = "Bob"; 
var bytes:ByteArray = new ByteArray(); 
bytes.writeUTFBytes(str); 
EncryptedLocalStore.setItem("firstName", bytes, false); 

true に設定された stronglyBound を使用して格納されたアイテムの場合、 getItem() に対する後続の呼び出しは、呼び出しを行っている AIR アプリケーションが格納を行っているアプリケーションと同一である場合(アプリケーションディレクトリ内のファイル内のデータが変更されていない場合)にのみ成功します。呼び出しを行っている AIR アプリケーションが格納を行っているアプリケーションと異なる場合、強力にバインドされたアイテムに対する getItem() を呼び出したときに、アプリケーションは Error 例外をスローします。アプリケーションをアップデートした場合、暗号化されたローカルストアに以前書き込まれた、強力にバインドされたデータを読み取ることはできません。モバイルデバイスでは stronglyBound true に設定しても無視され、このパラメーターは常に false として扱われます。

stronglyBound パラメーターが false (既定)に設定されている場合、アプリケーションがデータを読み取るためには、発行者 ID のみ同じままである必要があります。アプリケーションのビット列は変化してもよく(同じ発行者による署名が必要です)、データを格納したアプリケーションのビット列とまったく同じである必要はありません。元のアプリケーションと同じ発行者 ID を持つアップデートされたアプリケーションは、データに引き続きアクセスできます。

注意: 実際には、 stronglyBound true に設定すると、新たなデータ保護は追加されません。このため、悪意のあるユーザーがアプリケーションを改ざんして ELS に格納されているアイテムにアクセスする可能性が残ります。さらに、データは stronglyBound true 設定するか false に設定するかにかかわらず、外部の、ユーザー以外の脅威から同様に強力に保護されます。こうした理由から、 stronglyBound true に設定することはお勧めしません。

暗号化されたローカルストアのデータへのアクセス

次の例のように EncryptedLocalStore.getItem() メソッドを使用すると、暗号化されたローカルストアから値を取得できます。

var storedValue:ByteArray = EncryptedLocalStore.getItem("firstName"); 
trace(storedValue.readUTFBytes(storedValue.length)); // "Bob" 

暗号化されたローカルストアからのデータの削除

次の例のように、 EncryptedLocalStore.removeItem() メソッドを使用して、暗号化されたローカルストアから値を削除できます。

EncryptedLocalStore.removeItem("firstName"); 

次の例のように、 EncryptedLocalStore.reset() メソッドを呼び出すことによって、暗号化されたローカルストアからすべてのデータを消去できます。

EncryptedLocalStore.reset();