私は現在、最初の Android アプリを作成しており、Google クラウド エンドポイントを使用することにしました。このドキュメントに従って、バックエンド エンドポイント メソッドを保護しました: https://cloud.google.com/appengine/docs/java/endpoints/auth、 https://cloud.google.com/appengine/docs/java/endpoints/ gen_clients、https: //cloud.google.com/appengine/docs/java/endpoints/consume_android
基本的に、エンドポイントの WEB_CLIENT_ID と ANDROID_CLIENT_ID を生成し、保護する各メソッドに param User を追加し、最後にメソッド内でユーザーが null でないことを確認する必要があります。それ以外の場合は OAuthRequestException をスローします。
クライアント Android ライブラリをビルドし、Android アプリで次のように構成しました。
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String accountName = preferences.getString(MainActivity.PREF_ACCOUNT_NAME, null);
GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(context,
"server:client_id:xxxxxxxxx-xxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com");
credential.setSelectedAccountName(accountName);
DataLoaderApi.Builder builder = new DataLoaderApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), credential);
最初は、資格情報なしではバックエンド メソッドを使用できないため、かなりうまく機能しているように見えます。(401エラーになります)
残念ながら、「Charles Proxy」( https://www.charlesproxy.com/ ) などのツールを使用すると、バックエンド エンドポイントへの https 要求/応答を復号化できることに気付きました。Charles プロキシ証明書をスマートフォンにインストールして、プロキシを設定するだけです。
同じ問題の別の説明を次に示します: http://nickfishman.com/post/50557873036/reverse-engineering-native-apps-by-intercepting-network
これで、Android アプリで使用されるエンドポイント URL が得られました。各リクエストで送信されたすべてのパラメーターと、トークンを含む自動化プロパティを含むすべてのヘッダー プロパティを取得したので、基本的に、アプリでバックエンド エンドポイントを使用するために必要なすべての情報が得られます。 . :( しばらくするとトークンの有効期限が切れることはわかっていますが、その間にデータを抽出できます。
Google は、Google クラウド ストアのドキュメントでそれについて話します: https://cloud.google.com/storage/docs/concepts-techniques#bestpractices
「サーバー証明書を検証する HTTPS ライブラリを使用していることを確認してください。サーバー証明書の検証が行われていないと、アプリケーションが中間者攻撃やその他の攻撃に対して脆弱になります。」
素晴らしいですが、ツールで生成されたエンドポイント クライアント ライブラリを使用すると、脆弱になります。
この問題を回避する解決策があることは知っています: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
しかし、生成されたエンドポイント クライアント Android ライブラリを使用して、中間者攻撃を回避するにはどうすればよいですか?