Чтение чипа биометрического загранпаспорта по NFC — прямо на телефоне.
Приложение считывает NFC-чип заграничного паспорта (стандарт ICAO 9303), проверяет подлинность данных и показывает их в двух видах: 🎨 в аккуратном человекочитаемом формате и 🧬 в сыром виде (группы данных, hex, хэши). Всё работает офлайн — данные никуда не уходят.
⚠️ Это Proof-of-Concept (демо-прототип). Не используйте его как хранилище документов. Считанные данные — ваши персональные данные, не передавайте их третьим лицам.
- 📶 Чтение чипа по NFC — аутентификация PACE с автоматическим откатом на BAC.
- 🔐 Проверка подлинности — сверка хэшей групп данных с
EF.SODи проверка цифровой подписи Document Security Object (Passive Authentication). - 🖼️ Красивый формат — фото из чипа, ФИО (латиница и кириллица), даты, гражданство, пол.
- 🧬 RAW-режим — все группы данных (DG1, DG2, DG11, DG12, DG14, SOD) с hex-превью, размерами и статусом целостности.
- 📄 Экспорт в PDF — одностраничный отчёт с фото, полями и результатом проверки.
- 🗜️ Экспорт в ZIP — исходные
.binгруппы данных +passport.json+ фото (JPEG) + README. - 🕵️ Приватность по умолчанию — на диск ничего не пишется, файлы создаются только по вашему нажатию.
- 🌗 Светлая и тёмная темы — следует системной.
Отпечатки (DG3) и радужка (DG4) защищены не PACE/BAC, а Extended Access Control (Terminal Authentication). Чтобы чип отдал эти данные, приложение должно предъявить цепочку сертификатов пограничного контроля, подписанную государством-эмитентом.
Таких сертификатов нет ни у одного стороннего приложения — это фундаментальный замысел ICAO. Поэтому DG3/DG4 показаны в RAW-режиме как 🔒 заблокированные: приложение видит, что группы есть на чипе, но прочитать их не может.
| Компонент | Версия / технология |
|---|---|
| 🎯 Язык | Kotlin (встроенный в AGP 9) |
| 🎨 UI | Jetpack Compose + Material 3 |
| 🏗️ Сборка | Android Gradle Plugin 9.3.1, Gradle 9.7.1 |
| 📇 Чтение чипа | JMRTD 0.8.7 + SCUBA 0.0.26 |
| 🔑 Крипто | BouncyCastle bcprov / bcpkix 1.85 |
| 🖼️ Декод фото | JPEG2000 (com.gemalto.jp2) |
| 📱 minSdk / targetSdk | 29 / 37 |
# Debug
./gradlew :app:assembleDebug
# Release (нужен keystore.properties + .jks в корне проекта)
./gradlew :app:assembleReleaseAPK появятся в app/build/outputs/apk/. Release собирается с R8
(минификация + сжатие ресурсов), отдельными APK по ABI и универсальным.
Создайте keystore.properties в корне проекта (в VCS не попадает):
storeFile=zagranread-release.jks
storePassword=ваш_пароль
keyAlias=zagranread
keyPassword=ваш_пароль- ✅ Примите дисклеймер.
- ⌨️ Введите три поля из MRZ (машиночитаемой зоны на странице с фото): номер паспорта, дату рождения, срок действия.
- 📖 Раскройте паспорт и приложите обложкой к задней панели телефона.
- ⏳ Дождитесь чтения чипа — не двигайте паспорт.
- 👀 Смотрите результат, при необходимости экспортируйте в PDF или ZIP.
📵 Нужен телефон с NFC и настоящий биометрический паспорт нового образца. На эмуляторе прочитать нельзя.
raw/
EF.COM.bin # список групп данных
DG1.bin # MRZ
DG2.bin # фото (исходный формат чипа)
DG11.bin # доп. персональные данные (если есть)
DG12.bin # данные о выдаче (если есть)
DG14.bin # параметры Chip Authentication (если есть)
SOD.bin # Document Security Object
photo.jpg # фото, сконвертированное в JPEG
passport.json # разобранные поля + хэши + результат проверки
README.txt # пояснение
- 📷 Сканирование MRZ камерой (ML Kit OCR) вместо ручного ввода.
- 🏛️ Проверка цепочки сертификатов до CSCA (masterlist) — полноценная Passive Authentication.
Сделано как демонстрация возможностей чтения e-паспортов. Бережно относитесь к персональным данным. 🙏