Підпис додатків Android: як це працює та чому це важливо
Щоразу, коли ви встановлюєте програму на свій телефон Android, у фоновому режимі виконується тиха, але важлива перевірка безпеки. Ваш телефон перевіряє цифровий підпис пакета APK. Це криптографічне рукостискання запобігає зловмисним хакерам «отруїти» ваші програми зловмисним програмним забезпеченням, водночас гарантуючи, що розробники можуть надсилати оновлення, не втрачаючи своєї особи.
Якщо ви пишете програми, підписування – це те, що ви просто повинні зробити правильно; якщо ви просто любите возитися з Android, це одна з найприємніших частин системи для розуміння. У будь-якому випадку, як працює підпис додатків вартий вашого часу. Нижче ми ознайомимося з технологією, як розвивалися схеми підписання та як ви можете перевірити сертифікати вручну онлайн.
- Чому кожна програма для Android має бути підписана та яка криптографія задіяна (RSA / EC).
- Різниця між схемами підписів v1 (JAR), v2, v3 і v4 і те, яку з них має використовувати ваша програма сьогодні.
- Як Android вирішує, чи дозволяти оновлення на основі безперервності підпису.
- Як ротація ключів дозволяє розробнику змінити свій ключ підпису, не порушуючи існуючі встановлення.
- Як самостійно перевірити підпис будь-якого APK, у командному рядку або за допомогою нашого верифікатор на основі браузера.
Що таке підписання програм?
За своєю суттю, підписання програми – це процес, у якому розробник використовує Приватний ключ для створення блоку підпису для файлів своєї програми. Потім відповідний відкритий ключ вбудовується в APK у папці META-INF. Коли ваш телефон намагається встановити програму, він використовує відкритий ключ, щоб перевірити, чи збігається підпис із вмістом файлу.
Це забезпечує дві основні властивості:
- Незмінність: Якщо один байт коду програми змінено (наприклад, трояном), підпис більше не збігатиметься з файлом, і Android відмовиться встановлювати його.
- Підтвердження особи: Якщо програма намагається оновити існуючу, її підписи мають збігатися. Ось чому ви не можете встановити підроблений додаток Facebook поверх офіційного.
Еволюція схем підписання
Google постійно вдосконалює механізм підписання, щоб покращити швидкість і захист:
- V1 (підпис банку): Підписує окремі файли в APK (ZIP). Це повільно, оскільки ОС має розпакувати та перевірити кожен файл. Він також вразливий до певних маніпуляцій із ZIP.
- V2 (схема підпису APK): Підписує весь бінарний блок APK. Для перевірки не потрібно розпаковувати архів, що робить його неймовірно швидким. Він був представлений в Android 7.0 (Nougat).
- V3 (обертання клавіш): Розширює V2, додаючи "родовід" ключів. Це дозволяє розробнику довести, що новий ключ є авторизованим наступником старішого. Представлено в Android 9.0 (Pie).
- V4 (потокове підписання): Розроблено спеціально для інкрементних інсталяцій, дозволяючи перевіряти програми, поки вони ще завантажуються через USB або Wi-Fi.
Чому сертифікати важливі для стороннього завантаження
Коли ви завантажуєте APK з неофіційного джерела, Хешування сертифіката стане вашим найкращим другом. Відбиток сертифіката (наприклад, хеш SHA-256) унікально ідентифікує ключ підпису розробника. Кожна програма зберігає той самий ключ підпису в усіх своїх оновленнях, тож ви можете порівняти відбиток файлу .apk із опублікованим значенням розробника, щоб переконатися, що він справжній.
Якщо ви підозрюєте, що APK підроблений, вам слід запустити його через наш Онлайн верифікатор APK. Наш інструмент покаже вам:
- Загальна назва (CN) підписувача (наприклад, «Android»).
- Термін дії сертифіката.
- Відбитки пальців SHA-1/SHA-256.
Як Android перевіряє підпис під час встановлення
Крок «перевірити сертифікат» настільки часто замовчується, що варто пройтися, що насправді робить ОС, коли ви натискаєте APK, а Android вирішує, чи встановлювати його:
- Відкрийте файл APK як ZIP і знайдіть блок підпису. Для підписів v2/v3, це структурований блок безпосередньо перед центральним каталогом; для застарілої схеми v1 це вміст META-INF/*.RSA, *.DSA або *.EC.
- Обчислити дайджести SHA-256 кожного другого байта APK. Блок підпису виключено з власного дайджесту; все інше хешується визначеними фрагментами.
- Звіряйте дайджест кожного блоку з дайджестами, записаними в блоці підпису. Якщо бодай один байт було змінено після того, як розробник підписав файл, дайджести не збігатимуться, а встановлення буде відхилено із загальною помилкою «Програма не встановлена».
- Переконайтеся, що сам блок підпису був створений із закритим ключем сертифіката. Відкритий ключ сертифіката використовується для перевірки криптографічного підпису в блоці. Успішна перевірка означає, що той, хто підписав файл, володів закритим ключем, поєднаним із цим сертифікатом.
- Порівняйте цифровий відбиток сертифіката з будь-якою наявною інсталяцією пакета з такою ж назвою. Якщо пакет уже встановлено, а новий APK підписано іншим сертифікатом, інсталяція буде відхилена за допомогою INSTALL_FAILED_UPDATE_INCOMPATIBLE. Це основний захист ОС від видавання себе за іншу особу: зловмисник не може замінити ваш банківський додаток власною копією, якщо він також не вкраде банківський ключ підпису.
Нічого з цього не доводить, що розробник заслуговує на довіру, лише те, що файл, який ви збираєтеся встановити, байтово ідентичний тому, що вони підписали, і що ніхто інший не втручався в нього. Довіра до розробника – це окреме рішення, яке ви приймаєте, вирішуючи, з яких джерел ви встановлюєте.
Що насправді означає «невідповідність підпису».
Найпоширенішим сюрпризом для людей під час стороннього завантаження є помилка «невідповідність підпису» під час оновлення. Ось що насправді відбувається:
- Ви встановили Додаток X версії 1.0 із Play Store.
- Ви завантажуєте Додаток X версії 1.1 із джерела, не пов’язаного з Play.
- ОС бачить ту саму назву пакета (com.example.app), але файл APK підписано іншим сертифікатом (ключ підпису стороннього джерела, а не оригінального видавця). Відмовляється встановлювати.
На практиці це відбувається двома способами:
- APK третьої сторони – це справді від іншого видавництва, наприклад «модифікована» або «виправлена» копія. Відмова від встановлення є правильною поведінкою; його встановлення означало б довірити незнайомцю ті самі дані, які вже використовував додаток вашого банку.
- 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
Дві речі, які варто знати:
- термін дії має значення: 10 000 днів (приблизно 27 років) є умовним значенням, оскільки ОС розглядає оновлення, підписані ключем, термін дії якого майже закінчився або закінчився, як зламані. Згенеруйте один раз довготривалий ключ і захистіть його.
- Після публікації ви не можете легко змінити ключі. Схема підпису v3 додає ключ обертання як явну функцію: старий сертифікат «благословляє» новий через збережене підтвердження, дозволяючи ОС приймати оновлення від нового ключа, зберігаючи безперервність ідентичності. Без v3 втрата оригінального ключа означає припинення всіх існуючих установок.
Для тестових збірок зі стороннім завантаженням підійде непідписане сховище ключів налагодження; для виробництва використовуйте захищене паролем довготривале сховище ключів, яке зберігається в офлайновій резервній копії.
Перевірте ідентифікацію програми як професіонал
Не довіряйте загальним назвам файлів. Перевірте криптографічну основу своїх файлів APK за лічені секунди.
Перевірте сертифікати заразПоширені підводні камені
- Самопідписані сертифікати: Більшість програм для Android є самопідписаними. На відміну від SSL для веб-сайтів, немає центрального органу для підписання програм Android. Ви повинні довіряти безпосередньо розробнику.
- Сертифікати налагодження: Програми, створені для тестування, використовують загальний ключ "налагодження". Ці програми ніколи не можна оприлюднювати, і вони блокуються багатьма фільтрами безпеки.
- Втрата ключа: Якщо розробник втратить своє приватне сховище ключів, він може ніколи оновити свою програму знову. Їм доведеться випустити «Нову» програму з іншою назвою пакета.
Вибір правильної схеми підпису для цільового SDK
Підпис додатків непомітно забезпечує безпеку Android. Коли зв’язок приватний/відкритий ключ клацне, ви зможете оцінити сторонньо завантажену програму за її достоїнствами та підтвердити, що те, що ви встановлюєте, не було змінено з моменту підписання розробником. Щоб дізнатися більше про внутрішні пристрої Android, перегляньте наш посібник із формату XAPK.