Ваше приложение содержит открытые ключи API Google Cloud Platform (GCP). Подробности см. В этой статье Справочного центра Google.
Мой ключ ограничен использованием имени пакета и SHA1, но в магазине Google Play это предупреждение отображается.
Любая идея, почему это показывает, как это. Я определил свой ключ API в файле build.gradle и использовал его оттуда.
Ответы
Ответ 1
Есть реклама в Google Play? Казалось бы, по крайней мере, с 8-1-19, ключ API, который вызывает это, встроен в полную библиотеку объявлений Google Play Services. Это is--
implementation 'com.google.android.gms:play-services-ads:18.1.1'
выдает предупреждение, но
implementation 'com.google.android.gms:play-services-ads-lite:18.1.1'
который удаляет некоторый код, который уже существует в магазине воспроизведения, не делает. Сама ошибка ссылается на запутанный метод, который я отследил в apk:
com/google/android/gms/internal/ads/[obfuscatedstring]/<clinit>()
Это похоже на набор констант. Один из которых называется gads:safe_browsing:api_key
На всякий случай, если я ошибаюсь, и это не в каждом коде, я не буду воспроизводить его здесь, но он выглядит для меня как ключ GCP, который может вызвать проблему. Это 40 символов, и этот идентичный ключ можно найти в Интернете.
Я предполагаю, что если вы используете библиотеку play-services-ads (в отличие от библиотеки Firebase), она, вероятно, видит эту строку и издает сигнал тревоги.
Ответ 2
В соответствии с рекомендацией Google, необходимо ввести ограничения, такие как указание имени пакета, а также ключа SHA-1.
Это было объяснено здесь: https://cloud.google.com/docs/authentication/api-keys#securing_an_api_key
Теперь проблема заключается в том, что независимо от того, что вы делаете, ваш ключ API окажется в базе кода, т.е. если вы укажете его вне базы кода (через файл свойств), но передадите его через поле BuildConfig во время фазы сборки (весь ключ видимый кому-то, кто декомпилирует ваш код, поскольку он теперь является частью файла класса BuildConfig), или вы разделяете его и объединяете в кодовой базе (ключи разделения все еще видны, и любой может объединить их, увидев использование для получения окончательного ключа из декомпилированного APK).
Версия с разделенным ключом избавит от предупреждения в консоли воспроизведения, но ключ все еще открыт.
Мое предлагаемое решение, таким образом, состояло бы в том, чтобы закодировать ваш ключ 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)
}
Почему это лучше?
- Ваш ключ не такой, как в вашем проекте GCP.
- Игровая консоль, когда она сканирует вашу кодовую базу, не может сопоставить ее с ключами API вашего проекта GCP. Таким образом, никаких предупреждений.
Обновление (пояснение по использованию файла google-services.json для ключа API):
Решение использовать ключ API из google-services.json не совсем корректно. google-services.json генерируется как правило, если вы подключаете свою учетную запись в firebase. Определенный там ключ API имеет другую модель ограничения. Тот, который вы определили в своем проекте GCP, отличается, позволяя передавать имя пакета и ключ SHA-1, а также ограничивается определенным видом доступа API, таким как доступ только на Youtube. Таким образом, если использовать ключи API из google-services.json, то вы практически не используете ограничения, установленные в вашей учетной записи GCP. Аккаунты GCP не генерируют файл google-services.json.
В качестве примера приведу официальный документ от Google по настройке API-интерфейса Youtube, который использует ключи API, определенные в проекте GCP, и в документах он упоминает о непосредственном введении ключей в код. (что в любом случае неправильно, так как это разоблачено, но это Google для вас).
https://developers.google.com/youtube/android/player/setup
Нигде в документах не упоминается использование файла google-services.json для получения ключей API.
Ответ 3
Вы не должны определять ключ API непосредственно в файле build.gradle. В качестве альтернативы можно загрузить свой ключ API Firebase на свой собственный сервер (вы можете использовать крошечные веб-базы данных или MY sql). и при необходимости вызовите ключ API с вашего сервера и используйте его. Вот некоторая хорошая практика, которой следует следовать в этом случае. Для более подробной информации обратитесь к этому
-
Не вставляйте ключи API непосредственно в код. Ключи API, встроенные в код, могут быть случайно открыты для общественности. Например, вы можете забыть удалить ключи из кода, которым вы делитесь. Вместо того чтобы встраивать ключи API в свои приложения, храните их в переменных окружения или в файлах вне дерева исходных текстов вашего приложения.
-
Не храните ключи API в файлах внутри дерева исходного кода приложения. Если вы храните ключи API в файлах, храните файлы вне дерева исходного кода приложения, чтобы гарантировать, что ваши ключи не попадут в систему управления исходным кодом. Это особенно важно, если вы используете публичную систему управления исходным кодом, такую как GitHub.
-
Настройте ограничения приложения и ключа API. Добавляя ограничения, вы можете уменьшить влияние скомпрометированного ключа API.
-
Удалите ненужные ключи API, чтобы минимизировать подверженность атакам.
-
Регулярно обновляйте ключи API. Вы можете восстановить ключи API со страницы Credentials, щелкнув Восстановить ключ для каждого ключа. Затем обновите свои приложения, чтобы использовать вновь созданные ключи. Ваши старые ключи будут продолжать работать в течение 24 часов после генерации сменных ключей.
-
Просмотрите ваш код, прежде чем публиковать его. Убедитесь, что ваш код не содержит ключей API или любой другой частной информации, прежде чем вы сделаете ваш код общедоступным.
Ответ 4
Вы можете удалить это предупреждение, разделив ваши ключи на 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, это может увеличить ваш счет.
Ограничьте свой ключ API с помощью SHA и имени пакета, нажмите здесь для подробностей
Ответ 5
Извините, немного поздно, так как мой предыдущий ответ был просто обойти предупреждение после некоторого исследования, я нашел подходящее решение для этой проблемы
Вы можете получить ключ API из файла Google JSON. Файл google-services.json анализируется, и его значения добавляются в XML файл, к которому у вас есть доступ ко всем элементам json в качестве ресурсов Android в вашем коде Java. Для получения подробной информации нажмите здесь.
Ниже приведен пример доступа к ключу API Google из файла JSON:
activity.getResources().getString(R.string.google_api_key);