8.6 KiB
Биометрическая аутентификация в Rosetta Messenger
Обзор
В Android-приложение добавлена поддержка биометрической аутентификации (отпечаток пальца / Face ID), что позволяет пользователям разблокировать приложение без ввода пароля каждый раз.
Особенности реализации
1. Безопасность
- Android Keystore: Пароль шифруется с использованием ключа, хранящегося в Android Keystore
- Биометрическая защита: Ключ требует биометрической аутентификации для расшифровки
- GCM шифрование: Используется AES-GCM для шифрования пароля
- Автоматическая инвалидация: При изменении биометрических данных ключ становится недействительным
2. Компоненты
BiometricAuthManager
Основной менеджер для работы с биометрией:
isBiometricAvailable()- проверка доступности биометрии на устройствеencryptPassword()- шифрование пароля с биометрической защитойdecryptPassword()- расшифровка пароля через биометриюremoveBiometricData()- удаление сохраненных данных
BiometricPreferences
Управление настройками биометрии:
- Сохранение зашифрованных паролей для каждого аккаунта
- Включение/отключение биометрии
- Проверка наличия сохраненных данных
Интеграция в UnlockScreen
- Автоматическая попытка разблокировки при открытии экрана
- Кнопка для включения/отключения биометрии
- Автоматическое сохранение пароля после успешного входа
3. Пользовательский опыт
Первое использование
- Пользователь вводит пароль для разблокировки
- Если биометрия доступна, появляется опция "Включить биометрию"
- При включении пароль сохраняется зашифрованным
- При следующем входе автоматически появляется диалог биометрии
Автоматическая разблокировка
- При открытии экрана разблокировки автоматически запускается биометрическая аутентификация
- Пользователь может отменить и ввести пароль вручную
- При неудаче биометрии доступен ввод пароля
Управление
- Переключатель "Биометрия включена / Включить биометрию" под кнопкой 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
❌ Вредоносное ПО с правами администратора
Тестирование
Эмулятор
- Settings → Security → Fingerprint
- Добавить отпечаток
- В терминале эмулятора:
adb -e emu finger touch 1
Реальное устройство
- Настроить биометрию в системных настройках
- Запустить приложение
- Войти с паролем
- Включить биометрию
- Перезапустить приложение
Известные ограничения
- Множественные аккаунты: Биометрия настраивается отдельно для каждого аккаунта
- Смена биометрии: При изменении отпечатков/Face ID нужно заново включить биометрию
- Фоновая работа: Биометрия работает только когда приложение активно
Будущие улучшения
- Настройка в профиле пользователя
- Опция "Всегда спрашивать биометрию"
- Статистика использования биометрии
- Поддержка PIN-кода как альтернативы
- Экспорт/импорт настроек биометрии
Заключение
Биометрическая аутентификация значительно улучшает пользовательский опыт, позволяя быстро и безопасно разблокировать приложение. Реализация следует лучшим практикам Android Security и использует надежные криптографические методы.