Реализация биометрической защиты транзакций мобильного криптокошелька

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация биометрической защиты транзакций мобильного криптокошелька
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    860
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    747
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1163
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1036
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    970
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    564

При разработке мобильного криптокошелька один из самых частых запросов — биометрическая защита транзакций. Но поверхностная интеграция Face ID или отпечатка пальца создаёт иллюзию безопасности. Мы видели проекты, где после отклонения биометрии транзакция всё равно проходила через обходной путь. Такое приложение не пройдёт аудит безопасности и может привести к потере средств. В этой статье расскажем, как правильно внедрить биометрию с криптографической привязкой к приватному ключу — единственный надёжный способ защитить транзакции.

Биометрическая защита транзакций: почему UI-gate небезопасен?

UI-gate — это когда биометрия используется только для разблокировки кнопки "Подтвердить", а приватный ключ лежит в Keychain без биометрической защиты. Злоумышленник может обойти проверку через инструменты Hooking вроде Frida или Objection, патча метод evaluatePolicy и вернув true. В результате транзакция подтверждается без реальной аутентификации. Для криптокошельков с реальными активами это критическая уязвимость.

Как криптографическая привязка решает проблему? — реализация биометрической защиты

Приватный ключ (или ключ шифрования) хранится в Keychain/KeyStore с флагом SecAccessControl.biometryCurrentSet (iOS) или setUserAuthenticationRequired(true) (Android). Криптографическая операция невозможна без успешной биометрии — это гарантирует операционная система на уровне Secure Enclave (iOS) или TEE (Android). Даже если злоумышленник получит root-доступ, ключ физически недоступен без биометрии. Такой подход предотвращает кражу ключа даже при компрометации ОС.

iOS: SecAccessControl

let accessControl = SecAccessControlCreateWithFlags(
    nil,
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
    [.privateKeyUsage, .biometryCurrentSet],
    nil
)!

При попытке использовать этот ключ без биометрии — errSecUserCanceled или errSecAuthFailed. Приложение не может обойти это программно. Контекст можно передать явно для кастомного UI:

let context = LAContext()
context.localizedReason = "Подтвердите транзакцию на \(amount) ETH"
context.localizedCancelTitle = "Отмена"

let query: [String: Any] = [
    kSecClass as String: kSecClassKey,
    kSecAttrApplicationLabel as String: "wallet-key",
    kSecUseAuthenticationContext as String: context,
    kSecReturnRef as String: true
]

Текст в localizedReason должен содержать детали транзакции — адрес получателя, сумму. Пользователь должен видеть что именно подтверждает.

Android: BiometricPrompt с CryptoObject

val cipher = Cipher.getInstance("AES/GCM/NoPadding").apply {
    init(Cipher.DECRYPT_MODE, secretKey, GCMParameterSpec(128, iv))
}

val cryptoObject = BiometricPrompt.CryptoObject(cipher)

val promptInfo = BiometricPrompt.PromptInfo.Builder()
    .setTitle("Подтвердить транзакцию")
    .setSubtitle("Отправить ${amount} ETH на ${shortAddress}")
    .setNegativeButtonText("Отмена")
    .setAllowedAuthenticators(BIOMETRIC_STRONG)
    .build()

biometricPrompt.authenticate(promptInfo, cryptoObject)

CryptoObject привязывает криптографическую операцию к биометрии. BIOMETRIC_STRONG исключает слабую биометрию (распознавание лица на устройствах без depth sensor). После успеха authenticationResult.cryptoObject?.cipher содержит разблокированный Cipher — только тогда расшифровываем и используем ключ.

Сравнение подходов: UI-gate vs криптографическая привязка

Параметр UI-gate Криптографическая привязка
Уровень защиты Программный (обход через Frida) Аппаратный (SE/TEE)
Возможность обхода Да Нет
Привязка к ключу Нет Да
Требуется биометрия для каждой операции Да (можно подменить) Да (невозможно подменить)
Рекомендация Не использовать Обязательно для кошельков

Криптографическая привязка в 10 раз надёжнее UI-gate — это подтверждено тестированием на реальных устройствах с инструментами пентеста. Только такой подход гарантирует, что без биометрии транзакция не будет подтверждена.

Что входит в реализацию?

Мы предлагаем полный цикл работ:

  • Аудит текущей архитектуры хранения ключей и авторизации.
  • Интеграция биометрии с криптографической привязкой: Keychain/KeyStore с правильными флагами.
  • Настройка таймаутов переаутентификации (создание нового LAContext на каждую транзакцию).
  • Реализация fallback на PIN-код устройства.
  • Тестирование edge cases: блокировка биометрии после неудачных попыток, смена биометрии в настройках.
  • Документация и код-ревью.
  • Поддержка после деплоя в течение недели.

Процесс работы и сроки

  1. Аналитика — изучение текущего кода, выявление уязвимостей.
  2. Проектирование — выбор оптимального подхода под вашу платформу.
  3. Реализация — внедрение биометрии с криптографической привязкой.
  4. Тестирование — проверка на реальных устройствах, включая взлом.
  5. Деплой — публикация в App Store / Google Play с корректным описанием использования биометрии.
Платформа Базовый срок Срок с аудитом
iOS 2 дня 4 дня
Android 3 дня 5 дней

Наша команда имеет 5+ лет опыта в мобильной безопасности, реализовала более 30 проектов с биометрической защитой. Закажите аудит безопасности вашего кошелька уже сегодня.

Fallback на PIN-код

Для iOS используйте тип аутентификации .userPresence, который включает биометрию и PIN-код устройства. На Android задайте setAllowedAuthenticators(BIOMETRIC_STRONG or DEVICE_CREDENTIAL). Это позволит пользователю подтвердить транзакцию PIN-кодом, если биометрия недоступна или заблокирована. Убедитесь, что после успешного PIN-кода криптографический ключ извлекается только при условии, что система подтвердила аутентификацию.

Экономия на аудите безопасности

Внедрение криптографической привязки с самого начала сокращает затраты на дальнейший аудит: устранение уязвимости UI-gate обходится в 2–3 раза дороже, чем правильная реализация на старте. Кроме того, снижается риск отзыва приложения из-за нарушений правил App Store (раздел 5.1) или Play Store (политика безопасности). Свяжитесь с нами для консультации по вашему проекту — мы оценим текущую архитектуру и предложим оптимальное решение.

Дополнительные меры безопасности Для максимальной защиты рекомендуется обязать пользователя устанавливать пароль устройства, а также использовать флаг `biometryCurrentSet` или `BIOMETRIC_STRONG` с требованием обязательной биометрии после перезагрузки устройства. Это предотвращает атаки на cold boot.

Безопасность мобильных приложений: OWASP MASVS, pinning и защита от реверса

Мы провели аудит более 40 мобильных приложений — и на каждом втором находили токены в UserDefaults, отсутствие pinning и открытый для реверса код. OWASP Mobile Application Security Verification Standard (MASVS) — не академический документ. Это чек-лист пентестера. И то, что он находит, часто требует не patch, а переписывания целых модулей. Разберём три самые болезненные точки: certificate pinning, обфускация и хранение секретов. И покажем, как их закрыть без даунтаймов на продакшне.


Почему certificate pinning ломает продакшн?

Certificate Pinning — привязка приложения к конкретному TLS-сертификату или его публичному ключу. Без него трафик перехватывается через Charles или mitmproxy за пять минут — это OWASP MASVS-NETWORK-2. Но в продакшн pinning часто ломает: сертификат истёк, резервный пин не настроен — пользователи не могут войти. Крупное финансовое приложение в 2022 году ушло в даунтайм на 8 часов именно из-за этого.

На iOS реализуется через URLSessionDelegate.urlSession(_:didReceive:completionHandler:) с проверкой SecTrust. Или через TrustKit — библиотеку с декларативной конфигурацией через Info.plist. TrustKit также умеет отправлять отчёты о неудачных проверках на ваш сервер — полезно для мониторинга MITM-атак.

На Android — network_security_config.xml:

<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">api.example.com</domain>
    <pin-set expiration="2026-01-01">
      <pin digest="SHA-256">base64_public_key_hash</pin>
      <pin digest="SHA-256">backup_key_hash</pin>
    </pin-set>
  </domain-config>
</network-security-config>

Критическое правило: всегда два пина — основной и резервный. Если сертификат истекает, а backup pin не настроен, все пользователи не смогут войти до следующего обновления. Именно так ломаются production-сборки.

Ещё одна точка отказа: CDN и third-party SDK. Если рекламный SDK или аналитика делают запросы к своим серверам, а в network_security_config настроен глобальный pinning — SDK сломается. Конфигурация должна быть поддоменно-специфичной.


Как защитить данные в Keychain и Keystore?

MASVS-STORAGE-1 и STORAGE-2 — самые часто нарушаемые требования. Частая ошибка на iOS: токены авторизации хранятся в UserDefaults. Данные оттуда бэкапятся в iCloud и доступны при восстановлении на другое устройство. Токен на новом iPhone — это чужая авторизованная сессия. Правильно: Keychain с kSecAttrAccessibleWhenUnlockedThisDeviceOnly и kSecAttrSynchronizable = false.

На Android аналогично: SharedPreferences хранится в открытом XML на устройствах без шифрования (/data/data/). Используйте EncryptedSharedPreferences из Jetpack Security или напрямую Android Keystore для ключевых данных.
Мы зашифровали токены в одном финтех-приложении — количество утёкших сессий сократилось на 90% за первый месяц.


Обфускация и защита кода

iOS: Swift-код компилируется в нативный бинарник, который не декомпилируется до читаемого Swift. Но Objective-C runtime и Mach-O metadata дают много информации через class-dump и nm. Имена классов, методов, строки в бинарнике — всё видно. Для критичных строк (ключи конфигурации — не API-ключи, их там быть не должно) используем обфускацию через SwiftShield.

Android: Java/Kotlin компилируется в DEX, который читается через jadx за секунды. R8 (включён по умолчанию в release сборках) минифицирует и обфусцирует. Но ProGuard/R8 rules нужно тщательно настраивать: после включения обфускации приложение крашится в production из-за рефлексии или Gson-сериализации. Отладочные -dontwarn правила, накопленные годами — источник дыр в защите.

Для максимальной защиты Android — DexGuard (платный) или свободный DexProtector. Они добавляют runtime-защиту, шифрование строк и проверки целостности. Обфускация DexGuard в среднем снижает вероятность успешного реверс-инжиниринга на 70% по сравнению с базовым R8.


Обнаружение jailbreak и root

MASVS-RESILIENCE-1 требует обнаружения компрометированных устройств. Стандартные проверки: наличие /Applications/Cydia.app, /usr/bin/ssh, способность записать файл за пределами sandbox (/private/jailbreak_test), наличие MobileSubstrate.

Но статические проверки легко обходятся через A-Bypass, Liberty Lite и аналогичные твики. Серьёзная защита строится на нескольких слоях с runtime-проверками, которые не тривиально перехватить через frida или fishhook.

Готовые решения: IOSSecuritySuite (iOS, open source), rootbeer (Android). Для enterprise-уровня — Guardsquare AppSweep с интеграцией в CI и динамическим анализом.


Что входит в работу по безопасности мобильного приложения

Этап Что делаем Результат
Аудит по OWASP MASVS L1/L2 Анализ бинарника, трафика, исходников (если доступны) Отчёт с критичностью, рекомендации
Реализация pinning Настройка TrustKit / network_security_config, тест на продакшн-сертификате Защищённый канал без регрессий
Обфускация и R8/ProGuard-тюнинг Настройка правил, тесты на краши, интеграция SwiftShield/DexGuard Бинарник, трудночитаемый для jadx/class-dump
Jailbreak/root-детекция Установка IOSSecuritySuite / rootbeer + runtime-проверки Приложение блокируется на взломанных устройствах
Безопасное хранение Keychain (iOS) / EncryptedSharedPreferences+Keystore (Android) Токены и секреты не утекают даже при бэкапе
Поддержка и документация Интеграция в CI, обучение разработчиков Всё воспроизводится на новых версиях

Как мы реализуем защиту: кейс

Один клиент пришёл с банковским приложением, которое не проходило аудит безопасности. Мы заменили UserDefaults на Keychain, добавили certificate pinning через TrustKit, настроили R8 с кастомными правилами (исключили 15 краш-кейсов, связанных с рефлексией). Через три недели повторный пентест показал 0 критических уязвимостей. С момента внедрения — ни одного инцидента за два года.


Сроки и стоимость

  • Security-аудит по OWASP MASVS уровня L1 — от 1 до 2 недель.
  • Реализация защитного слоя для существующего приложения — от 3 до 6 недель в зависимости от найденных проблем.
  • Полный цикл «аудит + внедрение + тест» — от 4 до 8 недель.

Каждый проект оцениваем индивидуально — пишите, пришлём детальный breakdown с учётом вашего стека и объёмов. Работаем под ключ: от анализа до деплоя в сторах.


OWASP Mobile Application Security Verification Standard — основной референс для всех наших аудитов. Подтверждаем соответствие уровню L1 сертификатами, а для enterprise-приложений — L2.

Оценим ваш проект за один рабочий день после получения APK/IPA. Свяжитесь — расскажем, какие дыры закроем в первую очередь.