Intentの付加情報で、秘密にしたい情報を隠すには

1. はじめに

タオソフト著のAndroid Securityによると、Intentの付加情報に格納されているキーの一覧を取得するのは容易で、また、キーから、キーに対する情報を取得するのも容易とのことです。本では、対策として、付加情報を暗号化するか、安全な場所に永続化してインテントでは渡さないようにするとあります。

2. 付加情報を暗号化する場合の欠点

1. 暗号化を行う際に使う共通鍵はファイルとして保存しないのが望ましいので、端末ごとに固有な共通鍵を生成する必要があります。端末固有IDとしてIMSIやIMEIがありますが、これらを取得するにはREAD_PHONE_STATEパーミッションが必要で、この権限があると、端末の電話番号を取得でき、望ましくありません。また、パーミッションを要求しないANDROID_IDがありますが、意味のある値を返すのは Android 2.3以降で、Androidの幅広いバージョンをサポートしようとするとよくありません。
2. 共通鍵は、ファイルに保存すべきではないので、Activity、Service、Broadcastごとに生成すべきですし、暗号化もそれぞれのクラスで行うので、処理に時間がかかり、処理をUIスレッドやBroadcastで行う場合、「アプリケーションが応答していません」というANRが発生する可能性が高くなります。ANRを防ぐために、AsyncTask等を利用する方法もありますが、画面遷移等のたびにプログレスダイアログが出て、待たされるのはユーザビリティが悪いです。
3. 2で共通鍵生成は、クラスで行うと書きましたが、入り口画面のクラスで、生成し、static変数に格納し、他のクラスではそれを参照することも可能です。しかし、static変数の内容は、メモリーが不足すると、破棄される可能性があり、場合によってはアプリがクラッシュすることになります。

3. 画面遷移のたびに、秘密にしたい情報をプリファレンスに保存する

Intentの付加情報のうち、外部に漏らしたくない情報は、startActivityを呼ぶ前に、プリファレンスにモードMODE_PRIVATEで保存するといいです。遷移先のクラスでは、プリファレンスから読み込んで、データを取り出した直後に、SharedPrefereces.Editor#remove、SharedPrefereces.Editor#commitでデータを削除するといいです。プリファレンスを使う方法は、暗号化する方法に比べて、コードが複雑にならないし、処理時間がかかるということもありません。また、プリファレンスに保存したデータはMODE_PRIVATEなので、rootを取った端末でなければ、一時的保存されたデータが盗み見られることもありません。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-04 (日) 22:01:01 (2031d)