Files
mobile-android/docs/BIOMETRIC_AUTHENTICATION.md

8.6 KiB
Raw Permalink Blame History

Биометрическая аутентификация в Rosetta Messenger

Обзор

В Android-приложение добавлена поддержка биометрической аутентификации (отпечаток пальца / Face ID), что позволяет пользователям разблокировать приложение без ввода пароля каждый раз.

Особенности реализации

1. Безопасность

  • Android Keystore: Пароль шифруется с использованием ключа, хранящегося в Android Keystore
  • Биометрическая защита: Ключ требует биометрической аутентификации для расшифровки
  • GCM шифрование: Используется AES-GCM для шифрования пароля
  • Автоматическая инвалидация: При изменении биометрических данных ключ становится недействительным

2. Компоненты

BiometricAuthManager

Основной менеджер для работы с биометрией:

  • isBiometricAvailable() - проверка доступности биометрии на устройстве
  • encryptPassword() - шифрование пароля с биометрической защитой
  • decryptPassword() - расшифровка пароля через биометрию
  • removeBiometricData() - удаление сохраненных данных

BiometricPreferences

Управление настройками биометрии:

  • Сохранение зашифрованных паролей для каждого аккаунта
  • Включение/отключение биометрии
  • Проверка наличия сохраненных данных

Интеграция в UnlockScreen

  • Автоматическая попытка разблокировки при открытии экрана
  • Кнопка для включения/отключения биометрии
  • Автоматическое сохранение пароля после успешного входа

3. Пользовательский опыт

Первое использование

  1. Пользователь вводит пароль для разблокировки
  2. Если биометрия доступна, появляется опция "Включить биометрию"
  3. При включении пароль сохраняется зашифрованным
  4. При следующем входе автоматически появляется диалог биометрии

Автоматическая разблокировка

  • При открытии экрана разблокировки автоматически запускается биометрическая аутентификация
  • Пользователь может отменить и ввести пароль вручную
  • При неудаче биометрии доступен ввод пароля

Управление

  • Переключатель "Биометрия включена / Включить биометрию" под кнопкой Unlock
  • При отключении зашифрованный пароль удаляется
  • Можно включить/отключить в любой момент

4. Поддерживаемые методы

  • Отпечаток пальца (Fingerprint)
  • Face ID (на устройствах с поддержкой)
  • Iris (на поддерживаемых устройствах)
  • Любые другие биометрические методы, поддерживаемые Android BiometricPrompt

5. Требования

  • Android API 24+ (Android 7.0)
  • Устройство с биометрическим оборудованием
  • Настроенные биометрические данные в системе
  • Разрешение USE_BIOMETRIC (добавлено в AndroidManifest.xml)

Технические детали

Зависимости

implementation("androidx.biometric:biometric:1.1.0")

Разрешения

<uses-permission android:name="android.permission.USE_BIOMETRIC" />

Хранение данных

  • Зашифрованные пароли хранятся в DataStore
  • Отдельный пароль для каждого аккаунта
  • Формат: encrypted_password_{publicKey}

Шифрование

  • Алгоритм: AES/GCM/NoPadding
  • Размер ключа: 256 бит
  • Хранилище: Android Keystore
  • IV: Генерируется для каждого шифрования

Использование

Для разработчиков

Проверка доступности биометрии

val biometricManager = BiometricAuthManager(context)
when (biometricManager.isBiometricAvailable()) {
    BiometricAvailability.Available -> {
        // Биометрия доступна
    }
    is BiometricAvailability.NotAvailable -> {
        // Недоступна (причина в reason)
    }
    is BiometricAvailability.NotEnrolled -> {
        // Биометрия не настроена
    }
}

Шифрование пароля

biometricManager.encryptPassword(
    activity = activity,
    password = userPassword,
    onSuccess = { encryptedPassword ->
        // Сохранить зашифрованный пароль
    },
    onError = { errorMessage ->
        // Обработка ошибки
    },
    onCancel = {
        // Пользователь отменил
    }
)

Расшифровка пароля

biometricManager.decryptPassword(
    activity = activity,
    encryptedData = savedEncryptedPassword,
    onSuccess = { decryptedPassword ->
        // Использовать пароль для входа
    },
    onError = { errorMessage ->
        // Показать ошибку
    },
    onCancel = {
        // Показать ввод пароля
    }
)

Безопасность

Что защищено

Пароль никогда не хранится в открытом виде
Ключ шифрования защищен биометрией
Ключ недействителен после смены биометрических данных
Требуется подтверждение для каждой расшифровки

Что НЕ защищено

Root-доступ может скомпрометировать Keystore
Вредоносное ПО с правами администратора

Тестирование

Эмулятор

  1. Settings → Security → Fingerprint
  2. Добавить отпечаток
  3. В терминале эмулятора: adb -e emu finger touch 1

Реальное устройство

  1. Настроить биометрию в системных настройках
  2. Запустить приложение
  3. Войти с паролем
  4. Включить биометрию
  5. Перезапустить приложение

Известные ограничения

  1. Множественные аккаунты: Биометрия настраивается отдельно для каждого аккаунта
  2. Смена биометрии: При изменении отпечатков/Face ID нужно заново включить биометрию
  3. Фоновая работа: Биометрия работает только когда приложение активно

Будущие улучшения

  • Настройка в профиле пользователя
  • Опция "Всегда спрашивать биометрию"
  • Статистика использования биометрии
  • Поддержка PIN-кода как альтернативы
  • Экспорт/импорт настроек биометрии

Заключение

Биометрическая аутентификация значительно улучшает пользовательский опыт, позволяя быстро и безопасно разблокировать приложение. Реализация следует лучшим практикам Android Security и использует надежные криптографические методы.