前回までの内容で、Android端末内にパスワードを保存することができるようになりました。
しかし、このままではセキュアとは言えません。どんな問題があるのか考えてみましょう。
何が危険なのか
SharedPreferenceで保存したデータは、
/data/data/[パッケージ名]/shared_prefs/
以下に保存されます。
たとえばcom.example.helloworldというアプリを作った場合、getDefaultSharedPreferences()で取得・保存したデータは
/data/data/com.example.helloworld/shared_prefs/com.example.helloworld_preferences.xml
に保存されます。
rootedな端末では、以下のようにして簡単に生パスワードを表示できます。
> adb shell $ su # cat /data/data/com.example.helloworld/shared_prefs/com.example.helloworld_preferences.xml
端末にインストールされた、他の悪意あるアプリからも同じ操作ができるので、もう少し対策したいですね。
このXMLファイルは、所有者・グループともにアプリIDのユーザ(例:app_100)になっていて、パーミッションは660になっています。
そのため、rootを奪取されていない端末では、対策をしなくてもここまで簡単には表示できません。
しかし、Androidはrootを取得している人が無視できないほど多いので、このままでは危険です。
また、Android 2.3.3未満では、setuid周りのバグにより、悪意のあるソフトウェアがrootを取得することも出来るので、確実に対策をしておく必要があります。
そこで、次回はパスワードを暗号化して保存する方法について考えてみましょう。