4

クライアント Android アプリから PHP を実行している Web サーバーにデータを送信するための安全なシステムを構築しようとしています。

私がやりたいことは、アプリからのメッセージが、カスタム スクリプトを作成した悪意のあるユーザーからのものではなく、実際にアプリ自体からのものであることを確認できるように、システムが暗号的に安全であることを確認することです。システムをゲームするために cURL を使用します。

この種の検証には、次のような多くの使用例があります。

  • メトリクスを収集する広告がアプリに含まれている場合、API を見つけてダミー データを送信している悪意のあるユーザーからではなく、アプリからクリック データが送信されていることを確認する必要があります。

  • アプリには複数選択式の調査がある場合があり、ここでも、調査結果がアプリから収集されていることを確認する必要があります。

  • アプリは GPS トレースを収集しており、データがアプリ自体から送信されていることを確認したいと考えています。

これらの各ケースでは、メッセージの送信元がアプリ自体であり、データを偽造する単純なスクリプトを実行しているユーザーだけではないことを確認する必要があります。

私が検討したいくつかのアイデア:-

  • SSL - チャネルを保護し、改ざんを防止する (要件の一部を満たしている) のには適していますが、データ ソースの整合性を保証することはできません。

  • 公開鍵暗号化- クライアント アプリは秘密鍵を使用してデータを暗号化し、それをサーバーに送信して復号化することができます。問題は、アプリ内で秘密鍵をハードコーディングする必要があることです。アプリを逆コンパイルして秘密鍵を抽出し、偽のデータを送信するために使用される可能性があります。

  • 自作のアルゴリズム- これと非常によく似た質問がここで尋ねられます。ここでは、「誰かがあなたのアルゴリズムを理解する」までしか解決策が機能しません。つまり、優れた解決策ではありません!

  • ハッシュ チェーン- これは、ワンタイム キーを使用してクライアントからサーバーへの各データ ペイロードを検証する非常に興味深い方法のように思えましたが、パスワードをアプリで保存する必要があるため、アプリ自体が逆コンパイルされていないことに依存しています。 .

暗号化に関する私の知識が限られているため、この方法で完全に検証可能なシステムを構築することは実際には理論的に不可能であると考えています.エンドクライアントまたはチャネルを信頼できない場合、信頼の根拠となるものは何もないからです.. . でも、私が見落としているものがあるかもしれません!

4

1 に答える 1

0

それほど難しくはありません。アプリを認証するだけです。これは、単純なユーザーとパスワード (SSL 経由) を使用するか、クライアント認証を使用して行うことができます。どちらの場合も、資格情報はアプリに存在する必要があり、攻撃者は資格情報を抽出してアプリになりすますことができます。あなたはそれを残して、おそらくそれを軽減するためのいくつかの方法を実装する必要があります.

非対称鍵 (RSA など) または対称鍵 (HMAC など) で署名することにより、メッセージを認証することもできます。ノンスは、誰かが有効に署名されたメッセージをキャプチャしてサーバーに何度も送信するリプレイを防ぐのに役立ちます。プロトコルによっては、使用するオーバーヘッドが大きすぎる場合があります。

認証情報を保護するために、クライアントに認証情報を生成させてシステムKeyStoreに保存させることができますが、パブリック API では完全にはサポートされていません。詳細については、こちらを参照してください。もちろん、これには、生成された資格情報 (公開鍵など) をサーバーに安全に送信する必要がある追加の手順が必要であり、適切に実装するのは難しい場合があります。

何をするにしても、独自の暗号化アルゴリズムやプロトコルを発明しようとするのではなく、確立されたものを使用してください。

于 2012-12-19T06:53:43.100 に答える