サーバーと通信するアプリケーションがあります。ユーザーがアプリケーションにログインすると、サーバーに認証トークンが作成され、アプリケーションのSharedPreferences
に格納され、アプリケーションがWebサービスからデータを要求するたびに認証トークンが検証されます。
私の質問は、認証トークンをSharedPreferences
に保存しても安全ですか?ルート権限を持つユーザーが設定にアクセスし、トークンを抽出して使用できるため、私は尋ねています。
とにかくその点でより多くのセキュリティを持つ必要がありますか?
要するに、はい、それは行うのに完全に合理的なことです。
その上でできることは、難読化のみです。トークンをメモリに保持すると、rootユーザーがそれを覗き見ることができます。暗号化する場合は、暗号化キーもデバイスに保存する必要があります。そうしないと、トークンを使用できなくなります。キーは、トークンと同じくらい簡単に盗まれます。
誰かがデバイスのルートを持っている場合、すべてのベットはオフになります。その場合に最適化しないでください。アプリが非常に高いセキュリティを備えている場合は、ルート化されたデバイスでの実行を許可しないか、ユーザーがデバイスの盗難を報告できるリモートワイプ機能を実装し、サーバー上のトークンを無効にすることができます。
Android 4.3では Android Keystore が導入されました。これは暗号キーの安全なストアを提供すると言われています。これは、従来の方法で保存された暗号化されたトークンを解読するために使用されるキーを保存するために使用できます。ただし、参照先のリンクには、ルート化されたデバイスがこのセキュリティにどのように影響するかについての言及はありません。
2018年の更新:最新のAndroidデバイスは ハードウェアでバックアップされたキーストア 、信頼できるSoCが提供する実行環境(TEE)。これにより、ハッカーがAndroid =キーストア。
まあ、「不可能」は強い言葉です。 「実行不可能」と言った方が良いでしょう。つまり、TEEを提供するSoCに融合されたビットをスキャンするには、電子顕微鏡のようなものが必要です。あなたがこの種の注意を必要とするデータを持っているタイプの人なら、おそらくもっと大きな問題があるでしょう。
トークンがSharedPreferencesから読み取られることが懸念される場合、経験則として、格納されているデータに特定レベルの難読化を提供することをお勧めします。
この応答は、SharedPreferencesデータを難読化する単純なクラスの概要を示しています。 Android application にユーザー設定を保存する最も適切な方法は何ですか?