web-dev-qa-db-ja.com

アプリには、公開されたGoogle Cloud Platform(GCP)APIキーが含まれています。詳しくは、こちらのGoogleヘルプセンターの記事をご覧ください

キーがパッケージ名とSHA1を使用して制限されていますが、Google Playストアにこの警告が表示されます。

なぜそれがこのように表示されているのか、どんな考えでも。 build.gradleファイルでAPIキーを定義し、そこから使用しました。

26
Smeet

このようにキーを4つの部分に分割することで、この警告を削除できます

public static final String API_KEY_PART_1 = "Asdsdfdd-";

public static final String API_KEY_PART_2 = "dfsFdsdsFdd";

public static final String API_KEY_PART_3 = "Pgdhs_SfSfs";

public static final String API_KEY_PART_4 = "fdfDDSD";

文字列を連結して使用します

.attest(nonce.getBytes(), Constants.API_KEY_PART_1+Constants.API_KEY_PART_2+Constants.API_KEY_PART_3+Constants.API_KEY_PART_4)

注:APIキーをアプリケーションアクセスのみに制限してください。そうでなければ、誰かがあなたのAPKを逆コンパイルしてあなたのAPIキーを使用するなら、それはあなたの請求を増やすかもしれません。

SHA&パッケージ名 ここをクリック でAPIのキーを再制限します

4
Sahil Arora

グーグルの推奨によると、パッケージ名やSHA-1キーの指定などの制限を設けることが推奨されます。

ここで説明されています: https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key

ここでの問題は、APIキーを実行するとコードベースで終了することです。つまり、コードベースの外部で(いくつかのプロパティファイルを介して)指定した場合、ビルドフェーズ中にBuildConfigフィールドを介して渡されます(キー全体は現在はBuildConfigクラスファイルの一部であるため、コードを逆コンパイルしているユーザーに表示されます)または、コードベースで分割して連結します(分割キーは引き続き表示され、逆コンパイルから最終キーを取得するための使用法を見ると誰でも連結できます) apk)。

分割鍵バージョンはPlay Consoleの警告を取り除きますが、鍵はまだ公開されています。

したがって、私の提案する解決策は、APIキーをエンコードし、それをコードベースの周りに渡すことです。使用する直前にデコードします。

非常に簡単な例は次のとおりです。

これではなく、より良いエンコーディングアルゴを使用してください。これはデモンストレーションのみを目的としています。ここでは、Base64エンコーディングを使用しています。

import Android.util.Base64

fun main() {
   // API Key = "123456ABC"
   val myEncodedApiKey = "MTIzNDU2QUJD" // Should be passed via BuildConfig
   val decodedApiKey = Base64.decode(myEncodedApiKey, Base64.DEFAULT)

   // Now use `decodedApiKey` in your codebase.
   val decodedApiKeyString = String(decodedApiKey)
}

なぜこれが良いのですか?

  1. キーはGCPプロジェクトとまったく同じではありません。
  2. Play Consoleはコードベースをスキャンするときに、GCPプロジェクトのAPIキーと照合できません。したがって警告はありません。

更新(APIキーにgoogle-services.jsonファイルを使用する場合の説明):

Google-services.jsonからのAPIキーを使用するソリューションは、あまり有効ではありません。通常、firebaseアカウントに接続すると、google-services.jsonが生成されます。そこで定義されたAPIキーには、異なる制限モデルがあります。 GCPプロジェクトで定義するものは異なり、パッケージ名とSHA-1キーを渡すことができ、Youtubeのみのアクセスなど、特定の種類のAPIアクセスに制限されます。したがって、google-services.jsonからのAPIキーを使用する場合、GCPアカウントで設定した制限を本質的に使用していません。 GCPアカウントはgoogle-services.jsonファイルを生成しません。

ここでの見方を紹介するのは、GCPプロジェクトで定義されたAPIキーを使用するYoutube APIをセットアップするためのGoogleの公式ドキュメントであり、ドキュメントでは、キーをコードに直接配置することについて言及しています。 (それはそれが公開されているのでとにかく間違っていますが、それはあなたにとってGoogleです)。

https://developers.google.com/youtube/Android/player/setup

どのドキュメントでも、APIキーを取得するためにgoogle-services.jsonファイルを使用することはありません。

4
Nishant.

Google Play広告をお持ちですか?少なくとも8-1-19の時点で、これをトリガーするAPIキーが完全なGoogle Play Services広告ライブラリに埋め込まれているようです。あれは -

implementation 'com.google.Android.gms:play-services-ads:18.1.1'

アラートをトリガーしますが、

implementation 'com.google.Android.gms:play-services-ads-lite:18.1.1'

Playストアに既に存在する一部のコードを削除します 、ありません。エラー自体が難読化されたメソッドを引用しています。これは、apkで追跡しました。

com/google/Android/gms/internal/ads/[obfuscatedstring]/<clinit>()

これは一連の定数を設定しているようです。そのうちの1つはgads:safe_browsing:api_key

私が間違っていて、これが全員のコードにない場合に備えて、ここでは再現しませんが、問題を引き起こす可能性があるGCPキーのように見えます。 40文字で、この同じキーはインターネット上の他の場所にあります。

私の推測では、(Firebaseライブラリではなく)play-services-adsライブラリを使用している場合、おそらくこの文字列が表示され、アラームが鳴っています。

3
fattire

申し訳ありませんが、私の以前の回答がいくつかの調査の後に警告をバイパスしていたので少し遅れました適切な修正この問題の場合

Google jsonファイルからAPIキーを取得できます。 google-services.jsonファイルが解析され、jsonのすべての要素にアクセスできるxmlにその値がAndroid内のリソースJava =コード ここをクリック 詳細

以下は、jsonファイルからgoogle apiキーにアクセスする例です。

activity.getResources().getString(R.string.google_api_key);

1
Sahil Arora

遅いかもしれませんが、一部の人を助けるでしょう、

Fire-base json設定ファイルとGoogleマップ統合APIキーの間にリンクはありません

Firebaseの明確化

アプリにfirebaseを統合する場合に限り、json設定をコードに配置する必要があります。これがアプリをfirebaseに接続する唯一の方法です。

しかしグーグルマップの場合、それはあなたのアプリにあることは完全に別のものです、それはあなたにあなたのコードの他の場所に配置するための鍵を与えますが、ハードコードされたままではありません、または

ソリューション:

NishantSahil Arora の両方の解決策を組み合わせて、キーを別のものにエンコードし、それをいくつかに分割して、デコードをいくらか困難にする、私は4つの部分に分かれています。

ApiKeyをデコードします

        // getEncodedApiKey result encoded key,
        // splitted into four the part
        String thePartOne = "encodedPartOneMaybe";
        String thePartTwo = "encodedPartNextMaybe";
        String thePartThree = "encodedPartNextMaybe";
        String thePartFour = "encodedPartLast";

        public String getSplitedDecodedApiKey(){

            return new String(
                    Base64.decode(
                            Base64.decode(
                                        thePartOne +
                                            thePartTwo +
                                            thePartThree +
                                            thePartFour ,
                                    Base64.DEFAULT),
                            Base64.DEFAULT));
        }

ApiKeyをエンコードします

        //just to encode the string before splitting into the pieces
        //and remove this method from the source code
        public void getEncodedApiKey(){

            String plainApiKey = "xiosdflsghdfkj"; //
            String encodedApiKey = new String(
                    Base64.encode(
                            Base64.encode(plainApiKey.getBytes(),
                                    Base64.DEFAULT),
                            Base64.DEFAULT));
            Log.i(TAG, "getEncodedApiKey: " + encodedApiKey);
        }
0
Ali Tamoor

私の場合、Google APIキーを使用してYouTubeプレーヤーを初期化しているときに、同じ問題が長時間発生しました。

SHA&パッケージ名でAPIキーを制限した後でも、それは消えませんでした。

ただし、androidXに移行した後、セキュリティアラートはGoogle Play Consoleに表示されなくなります。

0
Abhisek Mallick