クライアント Android アプリから PHP を実行している Web サーバーにデータを送信するための安全なシステムを構築しようとしています。
私がやりたいことは、アプリからのメッセージが、カスタム スクリプトを作成した悪意のあるユーザーからのものではなく、実際にアプリ自体からのものであることを確認できるように、システムが暗号的に安全であることを確認することです。システムをゲームするために cURL を使用します。
この種の検証には、次のような多くの使用例があります。
メトリクスを収集する広告がアプリに含まれている場合、API を見つけてダミー データを送信している悪意のあるユーザーからではなく、アプリからクリック データが送信されていることを確認する必要があります。
アプリには複数選択式の調査がある場合があり、ここでも、調査結果がアプリから収集されていることを確認する必要があります。
アプリは GPS トレースを収集しており、データがアプリ自体から送信されていることを確認したいと考えています。
これらの各ケースでは、メッセージの送信元がアプリ自体であり、データを偽造する単純なスクリプトを実行しているユーザーだけではないことを確認する必要があります。
私が検討したいくつかのアイデア:-
SSL - チャネルを保護し、改ざんを防止する (要件の一部を満たしている) のには適していますが、データ ソースの整合性を保証することはできません。
公開鍵暗号化- クライアント アプリは秘密鍵を使用してデータを暗号化し、それをサーバーに送信して復号化することができます。問題は、アプリ内で秘密鍵をハードコーディングする必要があることです。アプリを逆コンパイルして秘密鍵を抽出し、偽のデータを送信するために使用される可能性があります。
自作のアルゴリズム- これと非常によく似た質問がここで尋ねられます。ここでは、「誰かがあなたのアルゴリズムを理解する」までしか解決策が機能しません。つまり、優れた解決策ではありません!
ハッシュ チェーン- これは、ワンタイム キーを使用してクライアントからサーバーへの各データ ペイロードを検証する非常に興味深い方法のように思えましたが、パスワードをアプリで保存する必要があるため、アプリ自体が逆コンパイルされていないことに依存しています。 .
暗号化に関する私の知識が限られているため、この方法で完全に検証可能なシステムを構築することは実際には理論的に不可能であると考えています.エンドクライアントまたはチャネルを信頼できない場合、信頼の根拠となるものは何もないからです.. . でも、私が見落としているものがあるかもしれません!