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

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

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

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

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

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

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

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

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

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

Биометрия при подтверждении транзакций — не просто «добавить Face ID перед отправкой». Неправильная реализация даёт ложное ощущение безопасности: приложение спрашивает Face ID, но после отклонения всё равно можно подтвердить транзакцию через другой путь, или биометрия проверяется только локально без криптографической привязки к ключу.

Два подхода — принципиально разные

Подход 1: биометрия как UI-gate. Показываем LAContext/BiometricPrompt, при успехе разблокируем кнопку «Подтвердить». Приватный ключ лежит в Keychain без биометрической защиты. Слабость: обход возможен через hooking (Frida, Objection) — патчим метод evaluatePolicy и возвращаем true. В продакшн-кошельке это недопустимо.

Подход 2: биометрия привязана к ключу. Приватный ключ (или ключ шифрования) в Keychain/KeyStore с SecAccessControl.biometryCurrentSet (iOS) или setUserAuthenticationRequired(true) (Android). Cryptographic operation невозможна без успешной биометрии — это гарантирует ОС, не приложение. Frida не помогает — ключ физически недоступен без биометрии на уровне SE/TEE.

Для кошелька используем только второй подход.

iOS: криптографически привязанная биометрия

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 — только тогда расшифровываем и используем ключ.

Что ещё важно

Таймаут переаутентификации: iOS кэширует успешную биометрию в LAContext на время его жизни. Для высокорисковых операций создавайте новый LAContext для каждой транзакции. Android: setUserAuthenticationValidityDurationSeconds(-1) требует биометрию при каждом использовании ключа.

Fallback на PIN: если биометрия недоступна (Face ID отключён, устройство без сенсора), пользователь должен иметь возможность подтвердить транзакцию через PIN. .userPresence вместо .biometryCurrentSet разрешает оба метода.

Сроки — 2–3 дня. Если реализуете впервые на конкретной платформе — плюс день на тестирование edge cases (biometry lockout после 5 неудачных попыток, смена биометрии в настройках).