Підпис додатків Android: як це працює та чому це важливо

A brass key on a smartphone showing a verified checkmark, illustrating Android app signing

Щоразу, коли ви встановлюєте програму на свій телефон Android, у фоновому режимі виконується тиха, але важлива перевірка безпеки. Ваш телефон перевіряє цифровий підпис пакета APK. Це криптографічне рукостискання запобігає зловмисним хакерам «отруїти» ваші програми зловмисним програмним забезпеченням, водночас гарантуючи, що розробники можуть надсилати оновлення, не втрачаючи своєї особи.

Якщо ви пишете програми, підписування – це те, що ви просто повинні зробити правильно; якщо ви просто любите возитися з Android, це одна з найприємніших частин системи для розуміння. У будь-якому випадку, як працює підпис додатків вартий вашого часу. Нижче ми ознайомимося з технологією, як розвивалися схеми підписання та як ви можете перевірити сертифікати вручну онлайн.

Про що ви дізнаєтеся в цій статті
  • Чому кожна програма для Android має бути підписана та яка криптографія задіяна (RSA / EC).
  • Різниця між схемами підписів v1 (JAR), v2, v3 і v4 і те, яку з них має використовувати ваша програма сьогодні.
  • Як Android вирішує, чи дозволяти оновлення на основі безперервності підпису.
  • Як ротація ключів дозволяє розробнику змінити свій ключ підпису, не порушуючи існуючі встановлення.
  • Як самостійно перевірити підпис будь-якого APK, у командному рядку або за допомогою нашого верифікатор на основі браузера.

Що таке підписання програм?

За своєю суттю, підписання програми – це процес, у якому розробник використовує Приватний ключ для створення блоку підпису для файлів своєї програми. Потім відповідний відкритий ключ вбудовується в APK у папці META-INF. Коли ваш телефон намагається встановити програму, він використовує відкритий ключ, щоб перевірити, чи збігається підпис із вмістом файлу.

Це забезпечує дві основні властивості:

  1. Незмінність: Якщо один байт коду програми змінено (наприклад, трояном), підпис більше не збігатиметься з файлом, і Android відмовиться встановлювати його.
  2. Підтвердження особи: Якщо програма намагається оновити існуючу, її підписи мають збігатися. Ось чому ви не можете встановити підроблений додаток Facebook поверх офіційного.

Еволюція схем підписання

Google постійно вдосконалює механізм підписання, щоб покращити швидкість і захист:

Чому сертифікати важливі для стороннього завантаження

Коли ви завантажуєте APK з неофіційного джерела, Хешування сертифіката стане вашим найкращим другом. Відбиток сертифіката (наприклад, хеш SHA-256) унікально ідентифікує ключ підпису розробника. Кожна програма зберігає той самий ключ підпису в усіх своїх оновленнях, тож ви можете порівняти відбиток файлу .apk із опублікованим значенням розробника, щоб переконатися, що він справжній.

Якщо ви підозрюєте, що APK підроблений, вам слід запустити його через наш Онлайн верифікатор APK. Наш інструмент покаже вам:

Як Android перевіряє підпис під час встановлення

Крок «перевірити сертифікат» настільки часто замовчується, що варто пройтися, що насправді робить ОС, коли ви натискаєте APK, а Android вирішує, чи встановлювати його:

  1. Відкрийте файл APK як ZIP і знайдіть блок підпису. Для підписів v2/v3, це структурований блок безпосередньо перед центральним каталогом; для застарілої схеми v1 це вміст META-INF/*.RSA, *.DSA або *.EC.
  2. Обчислити дайджести SHA-256 кожного другого байта APK. Блок підпису виключено з власного дайджесту; все інше хешується визначеними фрагментами.
  3. Звіряйте дайджест кожного блоку з дайджестами, записаними в блоці підпису. Якщо бодай один байт було змінено після того, як розробник підписав файл, дайджести не збігатимуться, а встановлення буде відхилено із загальною помилкою «Програма не встановлена».
  4. Переконайтеся, що сам блок підпису був створений із закритим ключем сертифіката. Відкритий ключ сертифіката використовується для перевірки криптографічного підпису в блоці. Успішна перевірка означає, що той, хто підписав файл, володів закритим ключем, поєднаним із цим сертифікатом.
  5. Порівняйте цифровий відбиток сертифіката з будь-якою наявною інсталяцією пакета з такою ж назвою. Якщо пакет уже встановлено, а новий APK підписано іншим сертифікатом, інсталяція буде відхилена за допомогою INSTALL_FAILED_UPDATE_INCOMPATIBLE. Це основний захист ОС від видавання себе за іншу особу: зловмисник не може замінити ваш банківський додаток власною копією, якщо він також не вкраде банківський ключ підпису.

Нічого з цього не доводить, що розробник заслуговує на довіру, лише те, що файл, який ви збираєтеся встановити, байтово ідентичний тому, що вони підписали, і що ніхто інший не втручався в нього. Довіра до розробника – це окреме рішення, яке ви приймаєте, вирішуючи, з яких джерел ви встановлюєте.

Що насправді означає «невідповідність підпису».

Найпоширенішим сюрпризом для людей під час стороннього завантаження є помилка «невідповідність підпису» під час оновлення. Ось що насправді відбувається:

На практиці це відбувається двома способами:

  1. APK третьої сторони – це справді від іншого видавництва, наприклад «модифікована» або «виправлена» копія. Відмова від встановлення є правильною поведінкою; його встановлення означало б довірити незнайомцю ті самі дані, які вже використовував додаток вашого банку.
  2. APK третьої сторони — повторне завантаження офіційного APK, але система підпису додатків Google Play підписує кожне завантаження користувача за допомогою обгортки ключ завантаження. Два пристрої іноді можуть бачити дещо різні дані підпису для однієї концептуальної версії програми. У цьому випадку відбиток сертифіката в корені все ще збігається; ви можете перевірити за допомогою нашого Перевірка APK.

Якщо цифровий відбиток сертифіката по-справжньому відрізняється від вашої існуючої інсталяції, єдиний вихід — спочатку видалити поточну копію (втрачаючи її дані), перш ніж завантажувати заміну, ніколи не вимикати перевірку підпису.

Створення власного ключа підпису (для розробників)

Якщо ви створюєте програми для Android, з часом вам доведеться підписати власні збірки. Стандартна однорядкова команда з використанням keytool із Java SDK:

keytool -genkeypair -v \
        -keystore my-release.keystore \
        -alias my-app -keyalg RSA -keysize 2048 \
        -validity 10000

Дві речі, які варто знати:

Для тестових збірок зі стороннім завантаженням підійде непідписане сховище ключів налагодження; для виробництва використовуйте захищене паролем довготривале сховище ключів, яке зберігається в офлайновій резервній копії.

Перевірте ідентифікацію програми як професіонал

Не довіряйте загальним назвам файлів. Перевірте криптографічну основу своїх файлів APK за лічені секунди.

Перевірте сертифікати зараз

Поширені підводні камені

  1. Самопідписані сертифікати: Більшість програм для Android є самопідписаними. На відміну від SSL для веб-сайтів, немає центрального органу для підписання програм Android. Ви повинні довіряти безпосередньо розробнику.
  2. Сертифікати налагодження: Програми, створені для тестування, використовують загальний ключ "налагодження". Ці програми ніколи не можна оприлюднювати, і вони блокуються багатьма фільтрами безпеки.
  3. Втрата ключа: Якщо розробник втратить своє приватне сховище ключів, він може ніколи оновити свою програму знову. Їм доведеться випустити «Нову» програму з іншою назвою пакета.

Вибір правильної схеми підпису для цільового SDK

Підпис додатків непомітно забезпечує безпеку Android. Коли зв’язок приватний/відкритий ключ клацне, ви зможете оцінити сторонньо завантажену програму за її достоїнствами та підтвердити, що те, що ви встановлюєте, не було змінено з моменту підписання розробником. Щоб дізнатися більше про внутрішні пристрої Android, перегляньте наш посібник із формату XAPK.

Розроблено та задокументовано Mst Shaefale Провідний розробник і архітектор пакетів Android • Перевірено на Android 12–15

Mst Shaefale підтримує злиття XAPK/APKS на стороні клієнта, аналізатор бінарних маніфестів та інструменти підписання APK v1+v2 у xapktoapk.com. Помітили застарілу команду чи зміну ОС? Надіслати редакційну примітку.