Skip to content

Latest commit

 

History

History
122 lines (89 loc) · 6.21 KB

README.md

File metadata and controls

122 lines (89 loc) · 6.21 KB

🛂 ZagranRead

Чтение чипа биометрического загранпаспорта по 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)?

Отпечатки (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:assembleRelease

APK появятся в app/build/outputs/apk/. Release собирается с R8 (минификация + сжатие ресурсов), отдельными APK по ABI и универсальным.

🔑 Подпись release

Создайте keystore.properties в корне проекта (в VCS не попадает):

storeFile=zagranread-release.jks
storePassword=ваш_пароль
keyAlias=zagranread
keyPassword=ваш_пароль

📲 Как пользоваться

  1. ✅ Примите дисклеймер.
  2. ⌨️ Введите три поля из MRZ (машиночитаемой зоны на странице с фото): номер паспорта, дату рождения, срок действия.
  3. 📖 Раскройте паспорт и приложите обложкой к задней панели телефона.
  4. ⏳ Дождитесь чтения чипа — не двигайте паспорт.
  5. 👀 Смотрите результат, при необходимости экспортируйте в PDF или ZIP.

📵 Нужен телефон с NFC и настоящий биометрический паспорт нового образца. На эмуляторе прочитать нельзя.


📦 Что внутри ZIP-экспорта

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-паспортов. Бережно относитесь к персональным данным. 🙏