Androidアプリの機密データを保護する最適な方法とは?
質問
はい、これはかなり一般的な質問ですが、私は、アプリに機密データを配布する Web サーバーと接触するアプリを処理するための最良の方法について感触を得ようとしています。 任意のリンク、一般的な情報のアドバイスなど、感謝します。
アプリはデータベースから取得した永続的なデータを一定時間保存するので、すべてがやや微妙なものになります。
どのように解決するのですか?
デバイスに機密データを保存する
それは利用者に大きく依存します。通常、Android OS は、実績のある Linux のファイル権限によって、アプリが互いのファイル (データベース、環境設定ファイル、アプリのプライベート ディレクトリに保存された通常のファイルなど) にアクセスするのを禁止しています。しかし、ルート化されたデバイスでは、アプリケーションはルートアクセスを取得し、すべてを読み取ることができます。考えておくべきことがいくつかあります。
- ユーザーが root 権限を持たないことがわかっている場合 (たとえば、Android Market を通してアプリを配布せず、社内でのみ配布する場合など)、Android のファイル システム ベースのセキュリティに単純に依存することができます。
- ユーザーが root 権限を取得した場合、その権限をどのアプリケーションに与えるかは非常に慎重になります。
- アプリがルート アクセスを取得した場合、多くの破壊を引き起こす可能性があります。アプリ内の情報は、ユーザーにとって最も心配のないものになる可能性があります。
- root 化は保証ゼロにつながります。アプリの中も含めて。root化された携帯電話で情報が漏れたとしても、責任を負うことはできません。
結論として、もしあなたの情報が超超繊細なもの (例: クレジットカード情報) でないなら、私は Android が提供するデフォルトのセキュリティ (すなわち、他のアプリがアクセスできないことを知っていて、すべてを平文で保存する) に固執することだけをお勧めします。
そうでない場合は、暗号化することをお勧めします。100 % 安全ではありませんが (ハッカーはアプリをデコンパイルしてデータを解読する方法を見つけ出すことができます)、クラックするのは非常に困難で、ほとんどのハッカーを阻止できます。特に、コードを次のような方法で難読化すると、ハッカーはこの方法を利用できなくなります。 プロガード .
サーバーからデバイスへの機密データの転送
ここで、いくつかの選択肢があります。まず第一に、常に HTTPS を使用することです。HTTPS を有効にした後、私が提案する 2 つの追加のセキュリティ対策を紹介します。
- API キー システムを使用します。すべてのリクエストにこの API キーを含め、レスポンスを返す前にサーバー側でそれをチェックします。HTTPSを使用しているので、攻撃者はネットワークスニッファーを使用してAPIキーを見つけることができないことを思い出してください。しかし、誰かがあなたのアプリを逆コンパイルすれば、これはかなり簡単に分かってしまう。例えば、APIキーをコードのあちこちに分割して置いておくことができます(例えば、2つか3つのクラスの静的メンバとして)。そして、リクエストを送信するときに、それらの断片をすべて連結するだけでいい。分解されたコードからそれを理解するのがさらに難しくなるように、他の種類の変換 (たとえばビットシフト) を適用することも可能です。
-
リクエストを送信するたびにキーを生成することができます。そのキーはあなただけが知っているちょっとしたロジックを使って生成されるでしょうから、クライアント側とサーバー側を同様に実装することができるようになります。例えば、リクエストに以下のようなパラメータを含めることができます。
time=1321802432&key=[generated-key]
ここでgenerated-key
から生成されます。time
パラメータから生成されます。例えばmd5(time + salt)
. このリクエストを受け取ったサーバーは、次の2つのことを行うことができます。-
をチェックします。
key
が本当にmd5(time + salt)
と同じです (クライアントとサーバーだけがこの salt を知っていて、上記の API キーと同じように難読化できることに注意してください)。 -
をチェックします。
time
が過去にさかのぼりすぎていないことを確認します(例えば、1-2分以上過去のものであれば、リクエストは無効であるとみなします)。
-
をチェックします。
2番目の方法は、誰もが送信されるパラメータを見ることができる、プレーンなHTTPリクエストも行っている場合により便利です。また、逆コンパイルされたコードから解明するのはずっと困難です。特に、鍵の計算ロジックを複数のクラスにまたがるようにした場合は、なおさらです。
しかし は、以下のことに注意してください。 何もない はアプリをクラックすることを不可能にします。難読化はいくらでもできますが、もしハッカーが 本当に ハッカーは、アプリケーションを逆コンパイルし、眠れない夜を過ごして、コードを通過し、リクエストがどのように形成されるかを把握することによって、データを入手することができます。唯一の 本当の データを保護する唯一の方法は、私が上に書いたすべての作業を行う以外に、ユーザーにパスワードを要求することです。分解されたコードから誰か(ユーザー)の頭の中にだけ存在するパスワードを得ることはできません :)。
関連
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] Androidアプリケーションのアクティビティ間でデータを受け渡すにはどうすればよいですか?
-
[解決済み] Androidで'Context'を取得する静的な方法?
-
[解決済み] Androidでインテントから余分なデータを取得するにはどうすればよいですか?
-
[解決済み] AndroidでEditTextのテキスト長を制限する最も良い方法は何ですか?
-
[解決済み] 新しいAndroid Fragmentをインスタンス化するためのベストプラクティス
-
[解決済み] Androidでアプリの共有設定データを削除する方法
-
[解決済み] Eclipseでのandroid:configChangesでのAdmobエラー
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] react nativeアプリのバージョン番号を更新する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] Android端末がHDPI画面かMDPI画面かを確認する方法は?
-
[解決済み] FragmentPagerAdapterのgetItemが呼び出されない
-
[解決済み] アンドロイドのdatepickerダイアログで最大の日付を設定するには?
-
[解決済み] サポートライブラリのアクションバーをPreferenceActivityに追加するには?
-
[解決済み] Recyclerviewと異なるタイプの行のインフレーションの処理