# Биометрическая аутентификация в 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) ## Технические детали ### Зависимости ```kotlin implementation("androidx.biometric:biometric:1.1.0") ``` ### Разрешения ```xml ``` ### Хранение данных - Зашифрованные пароли хранятся в DataStore - Отдельный пароль для каждого аккаунта - Формат: `encrypted_password_{publicKey}` ### Шифрование - **Алгоритм**: AES/GCM/NoPadding - **Размер ключа**: 256 бит - **Хранилище**: Android Keystore - **IV**: Генерируется для каждого шифрования ## Использование ### Для разработчиков #### Проверка доступности биометрии ```kotlin val biometricManager = BiometricAuthManager(context) when (biometricManager.isBiometricAvailable()) { BiometricAvailability.Available -> { // Биометрия доступна } is BiometricAvailability.NotAvailable -> { // Недоступна (причина в reason) } is BiometricAvailability.NotEnrolled -> { // Биометрия не настроена } } ``` #### Шифрование пароля ```kotlin biometricManager.encryptPassword( activity = activity, password = userPassword, onSuccess = { encryptedPassword -> // Сохранить зашифрованный пароль }, onError = { errorMessage -> // Обработка ошибки }, onCancel = { // Пользователь отменил } ) ``` #### Расшифровка пароля ```kotlin 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 и использует надежные криптографические методы.