1. ホーム
  2. android

Androidアプリの機密データを保護する最適な方法とは?

2023-11-07 04:51:39

質問

はい、これはかなり一般的な質問ですが、私は、アプリに機密データを配布する Web サーバーと接触するアプリを処理するための最良の方法について感触を得ようとしています。 任意のリンク、一般的な情報のアドバイスなど、感謝します。

アプリはデータベースから取得した永続的なデータを一定時間保存するので、すべてがやや微妙なものになります。

どのように解決するのですか?

デバイスに機密データを保存する

それは利用者に大きく依存します。通常、Android OS は、実績のある Linux のファイル権限によって、アプリが互いのファイル (データベース、環境設定ファイル、アプリのプライベート ディレクトリに保存された通常のファイルなど) にアクセスするのを禁止しています。しかし、ルート化されたデバイスでは、アプリケーションはルートアクセスを取得し、すべてを読み取ることができます。考えておくべきことがいくつかあります。

  1. ユーザーが root 権限を持たないことがわかっている場合 (たとえば、Android Market を通してアプリを配布せず、社内でのみ配布する場合など)、Android のファイル システム ベースのセキュリティに単純に依存することができます。
  2. ユーザーが root 権限を取得した場合、その権限をどのアプリケーションに与えるかは非常に慎重になります。
  3. アプリがルート アクセスを取得した場合、多くの破壊を引き起こす可能性があります。アプリ内の情報は、ユーザーにとって最も心配のないものになる可能性があります。
  4. root 化は保証ゼロにつながります。アプリの中も含めて。root化された携帯電話で情報が漏れたとしても、責任を負うことはできません。

結論として、もしあなたの情報が超超繊細なもの (例: クレジットカード情報) でないなら、私は Android が提供するデフォルトのセキュリティ (すなわち、他のアプリがアクセスできないことを知っていて、すべてを平文で保存する) に固執することだけをお勧めします。

そうでない場合は、暗号化することをお勧めします。100 % 安全ではありませんが (ハッカーはアプリをデコンパイルしてデータを解読する方法を見つけ出すことができます)、クラックするのは非常に困難で、ほとんどのハッカーを阻止できます。特に、コードを次のような方法で難読化すると、ハッカーはこの方法を利用できなくなります。 プロガード .


サーバーからデバイスへの機密データの転送

ここで、いくつかの選択肢があります。まず第一に、常に HTTPS を使用することです。HTTPS を有効にした後、私が提案する 2 つの追加のセキュリティ対策を紹介します。

  1. API キー システムを使用します。すべてのリクエストにこの API キーを含め、レスポンスを返す前にサーバー側でそれをチェックします。HTTPSを使用しているので、攻撃者はネットワークスニッファーを使用してAPIキーを見つけることができないことを思い出してください。しかし、誰かがあなたのアプリを逆コンパイルすれば、これはかなり簡単に分かってしまう。例えば、APIキーをコードのあちこちに分割して置いておくことができます(例えば、2つか3つのクラスの静的メンバとして)。そして、リクエストを送信するときに、それらの断片をすべて連結するだけでいい。分解されたコードからそれを理解するのがさらに難しくなるように、他の種類の変換 (たとえばビットシフト) を適用することも可能です。
  2. リクエストを送信するたびにキーを生成することができます。そのキーはあなただけが知っているちょっとしたロジックを使って生成されるでしょうから、クライアント側とサーバー側を同様に実装することができるようになります。例えば、リクエストに以下のようなパラメータを含めることができます。

    time=1321802432&key=[generated-key]

    ここで generated-key から生成されます。 time パラメータから生成されます。例えば md5(time + salt) . このリクエストを受け取ったサーバーは、次の2つのことを行うことができます。
    1. をチェックします。 key が本当に md5(time + salt) と同じです (クライアントとサーバーだけがこの salt を知っていて、上記の API キーと同じように難読化できることに注意してください)。
    2. をチェックします。 time が過去にさかのぼりすぎていないことを確認します(例えば、1-2分以上過去のものであれば、リクエストは無効であるとみなします)。

2番目の方法は、誰もが送信されるパラメータを見ることができる、プレーンなHTTPリクエストも行っている場合により便利です。また、逆コンパイルされたコードから解明するのはずっと困難です。特に、鍵の計算ロジックを複数のクラスにまたがるようにした場合は、なおさらです。

しかし は、以下のことに注意してください。 何もない はアプリをクラックすることを不可能にします。難読化はいくらでもできますが、もしハッカーが 本当に ハッカーは、アプリケーションを逆コンパイルし、眠れない夜を過ごして、コードを通過し、リクエストがどのように形成されるかを把握することによって、データを入手することができます。唯一の 本当の データを保護する唯一の方法は、私が上に書いたすべての作業を行う以外に、ユーザーにパスワードを要求することです。分解されたコードから誰か(ユーザー)の頭の中にだけ存在するパスワードを得ることはできません :)。