Соображения подписи, безопасности и удаление информации подписки из сборки APK

👁 32 просмотров
  1. Основные положения электронной подписи приложений
  2. Способы генерации ключей подписи и хранилища ключей
  3. Разница между хранилищами *.jks и *.keystore
  4. Ручная подписка APK
  5. Подписка APK на Google Play
  6. Соображения подписи, безопасности и удаление подписки из сборки APK
  7. Автоматизация процесса подписи на этапе сборки APK
  8. Автоматизация подписи гибридных приложений Android

Как правильно использовать сертификат подписи APK

Вы должны подписывать все ваши APK с тем же сертификатом на протяжении всей ожидаемой продолжительности ваших приложений. Есть несколько причин, почему вы должны это сделать:

  • Обновление приложения. Когда система устанавливает обновление для приложения, он сравнивает сертификаты в новой версии с версиями в существующей версии. Система разрешает обновление, если совпадают сертификаты. Если вы подписываете новую версию с другим сертификатом, вы должны назначить другое приложение для приложения в этом случае, пользователь устанавливает новую версию как совершенно новое приложение и это недопустимо, если вы не хотите потерять аудиторию пользователей вашего приложения;
  • Модульность приложений. Android позволяет APK, подписанным одним и тем же сертификатом, работать в том же процессе, если приложения запрашивают, чтобы система рассматривала их как одно приложение. Таким образом, вы можете развернуть свое приложение в модулях, и пользователи могут обновлять каждый из модулей самостоятельно;
  • Передача кода/данных через разрешения. Android обеспечивает принудительное выполнение разрешений на основе сигнатур, чтобы приложение могло раскрывать функциональность другому приложению, подписанному с указанным сертификатом. Подписывая несколько APK с тем же сертификатом и используя проверки разрешений на основе сигнатур, ваши приложения могут безопасно использовать код и данные.

Если вы планируете поддерживать обновления для приложения, убедитесь, что ключ подписи приложения имеет период действия, превышающий ожидаемый срок службы этого приложения. Рекомендуется использовать срок действия 25 лет и более. Когда срок действия ключа истекает, пользователи больше не смогут плавно обновляться до новых версий вашего приложения.

Если вы планируете публиковать свои приложения в Google Play, ключ, который вы используете для подписания этих APK, должен иметь срок действия, заканчивающийся после 22 октября 2033 года. Google Play применяет это требование, чтобы пользователи могли беспрепятственно обновлять приложения, когда доступны новые версии. Если вы используете подписку на Google Play, то Google гарантирует, что ваши приложения будут правильно подписаны и смогут получать обновления на протяжении всей своей жизни.

Безопасность ваших ключей подписи APK

Если вы решите самостоятельно управлять и подписывать ключ подписки на приложение и хранилище ключей (вместо того, чтобы использовать подписку на Google Play App), защита ключа подписи приложения имеет решающее значение как для вас, так и для пользователя. Если вы разрешаете кому-либо использовать ваш ключ или оставляете хранилище ключей и пароли в незащищенном месте, чтобы сторонние пользователи могли их найти и использовать, ваш авторский идентификатор и доверие пользователя скомпрометированы.

Примечание. Как мы до этого говорили, то вы можете управлять подписками приложения 2 способами:

  1. хранить у себя локально все ключи и подписывать самому
  2. храните ключи на сервере Google Play и подписываете там же.

Если вы используете подписку в Google Play, ваш ключ подписи приложения защищен с использованием инфраструктуры Google. Вы должны держать свой ключ в безопасности. Если ваш ключ загрузки взломан, вы можете связаться с Google, чтобы отменить его и получить новый ключ загрузки.

Если третьей стороне удастся украсть ваш ключ без вашего ведома или разрешения, этот человек может подписывать и распространять приложения от вашего имени, которые могут злонамеренно изменять ваш доступ к приложениям или могут повреждать их. Такой человек может также подписывать и распространять приложения под своей личностью, которые потом атакуют другие приложения или саму систему, или повреждают или крадут пользовательские данные.

Ваш секретный ключ необходим для подписания всех будущих версий вашего приложения. Если вы потеряете или замените свой ключ, вы не сможете публиковать обновления в своем существующем приложении. Вы не можете восстановить ранее сгенерированный ключ.

Ваша репутация как разработчика зависит от того, как вы защищаете свой ключ подписи приложения должным образом, до тех пор, пока ключ не будет истек. Вот несколько советов по обеспечению безопасности вашего ключа подписи приложений Android:

  • Выберите надежные пароли для хранилища ключей и ключа.
  • Не предоставляйте и не предоставляйте кому-либо свой секретный ключ, и не позволяйте посторонним лицам знать ваше хранилище ключей и ключевые пароли.
  • Храните файл хранилища ключей, содержащий ваш секретный ключ, в безопасном и недоступном для сторонних месте.

В общем, если вы будете соблюдать общие меры предосторожности при создании, использовании и сохранении ключа, он останется в безопасности.

Удаление информации о подписке из файлов сборки

Когда вы создаете конфигурацию подписи(release или debug), Android Studio добавляет вашу подпись в простой текст в файлы build.gradle модуля. Если вы работаете с командой или открываете свой код, вы должны перенести эту конфиденциальную информацию из файлов сборки, чтобы она была недоступна для других. Для этого вы должны создать отдельный файл свойств для хранения защищенной информации и обратиться к этому файлу в файлах сборки следующим образом:

1). Создайте конфигурацию подписи и назначьте ее одному или нескольким типам сборки. В этих инструкциях предполагается, что вы настроили одну конфигурацию подписи для типа вашей версии выпуска, как описано в разделе «Автоматизация процесса подписи на этапе сборки APK»

2). Создайте файл с именем keystore.properties в корневом каталоге вашего проекта. Этот файл должен содержать ваши данные для подписания:

storePassword=myStorePassword
keyPassword=mykeyPassword
keyAlias=myKeyAlias
storeFile=myStoreFileLocation

3). В файле build.gradle вашего модуля добавьте код для загрузки файла keystore.properties перед блоком android {}:

...

// Create a variable called keystorePropertiesFile, and initialize it to your
// keystore.properties file, in the rootProject folder.
def keystorePropertiesFile = rootProject.file("keystore.properties")

// Initialize a new Properties() object called keystoreProperties.
def keystoreProperties = new Properties()

// Load your keystore.properties file into the keystoreProperties object.
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    ...
}

Примечание. Вы можете сохранить файл keystore.properties в другом месте (например, в папке модуля, а не в корневой папке для проекта или на сервере сборки, если вы используете инструмент непрерывной интеграции). В этом случае вы должны изменить приведенный выше код, чтобы правильно инициализировать keystorePropertiesFile, используя ваше фактическое местоположение файла keystore.properties.

4). Вы можете ссылаться на свойства, хранящиеся в keystoreProperties, используя синтаксис keystoreProperties [‘propertyName’]. Измените блок signedConfigs файла build.gradle вашего модуля, чтобы ссылаться на информацию подписи, хранящуюся в keystoreProperties, с использованием этого синтаксиса.

android {
    signingConfigs {
        config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    ...
  }

5). Откройте окно инструмента Build Variants и убедитесь, что выбран тип сборки release.

6). Нажмите Build > Build APK, чтобы создать свою сборку релизов, и подтвердите, что Android Studio создала подписанный APK в каталоге build/output/apk/ для вашего модуля.

Поскольку ваши файлы сборки больше не содержат конфиденциальной информации, теперь вы можете включить их в исходный элемент управления или загрузить их в общую кодовую базу. Обязательно сохраните файл keystore.properties. Это может включать удаление его из вашей системы управления версиями.