Я провел небольшое исследование и хотел бы объяснить здесь, как Подпись приложения Google Play работает и как использовать ее с разрешением уровня подписи.
Прежде всего, если мы используем Google Play App Signing, мы фактически используем две клавиши для входа в наше приложение. Первый - Ключ загрузки , второй - Ключ подписи приложения . Оба сгенерированы аналогичным образом из Android Studio, и мы можем использовать ключ загрузки из одного приложения в качестве ключа подписи приложения для другого приложения.
Ключ подписи приложения хранится в Google Play, и после его загрузки у нас нет к нему доступа. У нас есть возможность загрузить его, когда мы регистрируемся в Google Play App Signing для существующего приложения, или оно может быть сгенерировано Google Play для нового приложения, и тогда мы вообще не имеем к нему доступа. Можно сказать, что Ключ подписи приложения на самом деле является реальным ключом, который мы используем для распространения приложения для наших пользователей.
Весь механизм выглядит так:
Источник изображения (Официальная документация для подписи приложений)
Как вы можете видеть на изображении, мы используем Ключ загрузки , чтобы загрузить наше приложение в Google Play, а затем Google Play удаляет нашу подпись и выполняет вход в наше приложение с другим ключом. Это полезно, потому что если мы потеряем наш ключ загрузки, мы не потеряем возможность загрузить наше приложение (мы можем попросить Google использовать новый ключ загрузки). Более того, Google Play теперь может разбивать наше приложение на более мелкие части и распространять его независимо, и каждая часть будет подписана с помощью нашего ключа подписи приложения ( Пакеты приложений Android ).
Недостатком этого решения является то, что приложение, которое мы загружаем в магазин, имеет другую подпись, чем приложение, которое мы загружаем из Google Play.
Это очень проблематично, особенно если мы используем разрешение уровня подписи в нашем приложении. Кроме того, это также проблема, когда мы хотим загрузить наше приложение в магазин, отличный от Google Play.
Используя разрешение на уровне подписи, мы можем безопасно обмениваться данными между двумя приложениями ( пример использования ), но есть одно главное условие - оба приложения должны иметь одинаковую подпись.
Даже если мы используем один и тот же Ключ загрузки , это не означает, что наши приложения будут иметь одинаковые подписи, поскольку ключи, используемые Google Play, могут отличаться.
На практике это означает, что когда вы тестируете выпускную версию своего приложения, все выглядит отлично, но после загрузки его в Google Play это не работает (эта проблема затрагивает все функции, которые зависят от подписи приложения - логин на Facebook, обнаружение тампера).
Итак, как использовать один и тот же ключ для двух приложений, когда мы используем Google Play App Signing?
Когда мы создаем новое приложение в Google Play и пытаемся создать первый выпуск в производство, Google Play спросит:
И тогда в дополнительных параметрах мы можем найти:
После этого оба приложения будут иметь одинаковую подпись для наших пользователей.
К сожалению, если мы попытаемся сделать это для приложения, которое уже опубликовано для наших пользователей (мы можем зарегистрироваться в Google Play App Signing позже), у нас не будет этой опции доступной, и мы не сможем использовать тот же ключ.
Что делать, если мы не можем этого сделать, но мы хотим использовать безопасный обмен данными между двумя приложениями?
Мы можем проверить подпись, которая не совпадает вручную, и попытаться предотвратить атаку изнутри нашего приложения, которое предоставляет данные. Это не так безопасно, как первое решение, но более безопасно, чем ничего не делать :)