こんにちはAndroidアプリケーションで作業しています。このアプリケーションでは、いくつかのhttps Webサービス呼び出しを実行する必要があります。すべてのWebサービスURLとWeb APIキーは、コードとIPアドレスに含まれていますサーバーの誰か。私のアプリでリバースエンジニアリングを行うと、その人は私のWebサービスのURLとAPIキーを取得できるため、RESTクライアントを使用して攻撃するだけです。
攻撃者が、strings.xmlで定義したWEB API KEYを取得できないようにセットアップを保護するにはどうすればよいですか?
<string name="WEB_API_KEY">XXXXXXXXXXXXXXXXXXXXXXXXXXX</string>
それは簡単です。クライアントを信頼しないでください。
ユーザーが知らないはずのクライアントにシークレットを保存することをビジネスに依存しないでください。
これがAndroidであるか、デスクトップであるか、その他何でもかまいません。 ATM(加重金庫の壁に取り付けられ、カメラが周囲にある)のようにデバイスを保護する準備ができていない限り、クライアントは信頼されません。また、ATMを使用している場合でも、デバイスを信頼しないでください。
攻撃者がStrings.xmlで定義した私のWEB APIキーを取得できないように保護する方法
できません。する必要はありません。
ユーザーおよびデバイスごとに認証します。ユーザーが同じAPIキーを他のユーザーと共有してはいけません。APIキーは、クライアントではなくユーザーまたはユーザーの決定を認証する必要があります。
アプリ全体が単一のAPIキーを持つ外部API(Twitterなど)を呼び出す場合は、次のいずれかを実行できます。
代わりに提供顧客が自分のモバイルアプリで呼び出すことを期待するAPIである場合は、より安全なものを考え出すことができます。理想的なソリューションは、実装者にAPIキーキーを提供することです。APIキーキーは、単一の共有シークレットではなく、個々のユーザーのキーを生成するためのキーです。
これを行う最良の方法は、PKIを作成することです。 APIキーの代わりに「信頼されたルート」証明書をアプリ開発者に発行します。次に、秘密鍵を使用してユーザー証明書に署名します。各証明書は、単一のインストールの単一ユーザーに対して有効です。これらは、短期間のセッション証明書(ユーザーが開発者のサービスに「ログオン」したときに作成され、短時間のみ有効)または長期(ユーザーがアプリをインストールしたときに作成され、かなり有効なもの)のいずれかです。長い時間)。ただし、デベロッパーがユーザーによる悪用の責任を負い、自分を保護するためのツールを提供することを理解している限り、これらのオプションのどれが最も理にかなっているのかを彼に選択させることができます。
概念的に同様のアプローチは、PKIのコンポーネントを取り、それらを個別に使用することです。ユーザーに「開発者キー」を与え、RSA署名のような複雑なものから、ランダムな「ユーザーキー」と開発者キーを連結して結果をハッシュするような単純なものまで、既知のメカニズムを使用して「ユーザーキー」に署名します。 。これはワークフローで作業する方が簡単かもしれませんが、おそらく間違いを犯しやすいかもしれません。しかし、いずれにしても、開発者のAPIキーをすべてのユーザーと共有するよりもおそらく安全です。