web-dev-qa-db-fra.com

Votre application contient des clés d'API Google Cloud Platform (GCP) exposées. Veuillez consulter cet article du centre d'aide Google pour plus de détails.

Ma clé est restreinte à l'aide du nom du package et de SHA1, mais Google Play Store affiche toujours cet avertissement.

Toute idée pourquoi cela se présente comme ça. J'ai défini ma clé API dans le fichier build.gradle et l'utilise à partir de là.

26
Smeet

Vous pouvez supprimer cet avertissement en divisant vos clés en 4 parties comme celle-ci

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";

et l'utiliser en concaténant des chaînes

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

REMARQUE: assurez-vous de limiter votre clé API à l'accès aux applications uniquement. sinon, si quelqu'un décompile votre apk et utilise votre clé api, cela peut augmenter votre facturation.

Restriciez la clé de votre API avec SHA & nom du package cliquez ici pour plus de détails

4
Sahil Arora

Selon la recommandation de Google, la mise en place de restrictions telles que la spécification du nom du package et de la clé SHA-1 est la voie à suivre.

Il a été expliqué ici: https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key

Maintenant, le problème ici est que quoi que vous fassiez, votre clé API se retrouvera dans la base de code, c'est-à-dire si vous la spécifiez en dehors de votre base de code (via un fichier de propriétés) mais la transmettez via le champ BuildConfig pendant la phase de construction (la clé entière est visible par quelqu'un qui décompile votre code car il fait maintenant partie du fichier de classe BuildConfig) ou vous le divisez et concaténez dans la base de code (les clés de fractionnement sont toujours visibles et tout le monde peut les concaténer en voyant l'utilisation pour obtenir la clé finale d'une décompilation apk).

La version à clé partagée supprimera l'avertissement dans la console Play, mais la clé est toujours exposée.

Ma solution suggérée serait donc de coder votre clé API et de la transmettre autour de votre base de code. Juste avant de l'utiliser, vous le décodez.

Un exemple très simple peut être:

Veuillez utiliser un meilleur algorithme d'encodage et non celui-ci, c'est uniquement à des fins de démonstration. Ici, nous utilisons l'encodage 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)
}

Pourquoi est-ce mieux?

  1. Votre clé n'est pas exactement la même que dans votre projet GCP.
  2. La console de lecture lorsqu'elle analyse votre base de code ne peut pas la faire correspondre aux clés de l'API de votre projet GCP. Ainsi, aucun avertissement.

Mise à jour (clarification sur l'utilisation du fichier google-services.json pour la clé API):

La solution pour utiliser la clé API de google-services.json n'est pas tout à fait valide. google-services.json est un fichier généré généralement si vous connectez votre compte Firebase. La clé API définie ici a un modèle de restriction différent. Celui que vous définissez dans votre projet GCP est différent, vous permettant de transmettre le nom du package et une clé SHA-1 ainsi que restreint à un type spécifique d'accès à l'API tel que l'accès à Youtube uniquement. Donc, si l'on devait utiliser les clés API de google-services.json, vous n'utilisez essentiellement pas les restrictions que vous avez définies dans votre compte GCP. Les comptes GCP ne génèrent pas de fichier google-services.json.

Pour mettre en perspective voici un document officiel de Google pour la mise en place de l'API Youtube qui utilise les clés d'API définies par le projet GCP et dans les documents, il mentionne de mettre directement les clés dans le code. (ce qui est de toute façon erroné car il est exposé, mais c'est Google pour vous).

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

Nulle part dans les documents, il est fait référence à utiliser le fichier google-services.json pour récupérer les clés API.

4
Nishant.

Vous avez des annonces Google Play? Il semblerait qu'au moins au 8-1-19, une clé api qui déclenche cela soit intégrée dans la bibliothèque complète d'annonces des services Google Play. C'est--

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

déclenche l'alerte, mais

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

qui supprime du code qui existe déjà dans le Play Store , non. L'erreur elle-même cite une méthode obscurcie, que j'ai retrouvée dans l'apk pour:

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

Cela semble définir un tas de constantes. L'un d'eux s'appelle gads:safe_browsing:api_key

Au cas où je me trompe et que ce n'est pas dans le code de tout le monde, je ne le reproduirai pas ici, mais il me semble que c'est une clé GCP qui pourrait déclencher le problème. Il est composé de 40 caractères et cette clé identique se trouve ailleurs sur Internet.

Je suppose que si vous utilisez la bibliothèque play-services-ads (par opposition à la bibliothèque Firebase), il voit probablement cette chaîne et déclenche une alarme.

3
fattire

Désolé, un peu tard car ma réponse précédente était juste de contourner l'avertissement après quelques recherches, j'ai trouvé un correctif approprié pour ce problème

vous pouvez obtenir la clé api du fichier google json . Le fichier google-services.json est analysé et ses valeurs sont ajoutées à un xml auquel vous avez accès à tous les éléments de json comme Android ressources dans votre Java = code cliquez ici pour plus de détails

Voici un exemple pour accéder à la clé Google api à partir du fichier json:

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

1
Sahil Arora

il peut être en retard, mais cela aidera certains des gars,

Il n'y a aucun lien entre le fichier de configuration JSON de Fire-base et la clé API d'intégration de Google Maps

Clarification Firebase

si et seulement si vous intégrez firebase dans votre application, cela nécessite que la configuration json soit placée dans votre code, et c'est le seul moyen de connecter l'application à firebase.

mais dans le cas de Google Maps, c'est totalement différent d'être dans votre application, cela vous donne la clé à placer dans votre code ailleurs mais pas codé en dur ou tel quel,

Solution:

j'ai combiné les deux solutions pour contourner, de Nishant et Sahil Arora , pour encoder la clé en autre chose et la diviser en morceaux pour la rendre difficile à décoder , je me divise en quatre parties, vous pouvez autant que vous vous sentez bien:

Décodez-vous 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));
        }

Encodez votre 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

J'ai eu le même problème pendant longtemps, dans mon cas lors de l'initialisation du lecteur Youtube avec la clé Google api.

Il n'a pas disparu même après avoir restreint la clé API avec SHA & nom du package.

Cependant, après la migration vers androidX, l'alerte de sécurité a disparu dans la console Google Play.

0
Abhisek Mallick