Чтобы защитить систему аутентификации в Android, рекомендуем отказаться от модели на основе паролей, особенно для конфиденциальных аккаунтов, таких как банковские счета и электронная почта. Помните, что некоторые приложения, которые устанавливают ваши пользователи, могут быть вредоносными и пытаться украсть их данные.
Кроме того, не думайте, что устройством будут пользоваться только авторизованные пользователи. Кража телефонов – распространенная проблема. Злоумышленники нацеливаются на разблокированные устройства, чтобы получить доступ к пользовательским данным или финансовым приложениям. Мы рекомендуем всем приложениям, работающим с конфиденциальными данными, реализовать разумный тайм-аут аутентификации (например, 15 минут) с биометрической проверкой и требовать дополнительную аутентификацию перед выполнением конфиденциальных действий, таких как денежные переводы.
Диалоговое окно биометрической аутентификации
Библиотека Biometrics предлагает набор функций для отображения запроса на биометрическую аутентификацию, например распознавание лица или отпечатка пальца. Однако биометрические запросы можно настроить так, чтобы в случае неудачи использовался PIN-код, пароль или графический ключ, что связано с известными рисками подсматривания через плечо. Для приложений, работающих с конфиденциальными данными, мы рекомендуем не использовать PIN-код в качестве резервного способа аутентификации. Если пользователь исчерпал количество попыток биометрической аутентификации, он может подождать, войти с помощью пароля или сбросить настройки аккаунта. Для сброса аккаунта должны требоваться факторы, которые нелегко получить на устройстве (см. рекомендации ниже).
Как это помогает защититься от мошенничества и кражи телефона
Например, чтобы предотвратить мошенничество, можно запрашивать биометрическую аутентификацию в приложении перед транзакцией. Когда пользователь хочет совершить финансовую транзакцию, появляется диалоговое окно биометрической аутентификации, чтобы подтвердить, что транзакцию совершает именно он. Это защитит от злоумышленников, которые украли устройство и знают или не знают LSKF, поскольку им придется доказать, что они являются владельцами устройства.
Для дополнительной защиты мы рекомендуем разработчикам приложений запрашивать биометрическую аутентификацию класса 3 и использовать CryptoObject для банковских и финансовых транзакций.
Реализация
- Убедитесь, что вы включили библиотеку androidx.biometric.
- Добавьте диалоговое окно биометрической аутентификации в действие или фрагмент, содержащий логику, для которой требуется аутентификация пользователя.
Kotlin
private var executor: Executor? = null private var biometricPrompt: BiometricPrompt? = null private var promptInfo: BiometricPrompt.PromptInfo? = null fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) executor = ContextCompat.getMainExecutor(this) biometricPrompt = BiometricPrompt(this@MainActivity, executor, object : AuthenticationCallback() { fun onAuthenticationError( errorCode: Int, @NonNull errString: CharSequence ) { super.onAuthenticationError(errorCode, errString) Toast.makeText( getApplicationContext(), "Authentication error: $errString", Toast.LENGTH_SHORT ) .show() } fun onAuthenticationSucceeded( @NonNull result: BiometricPrompt.AuthenticationResult? ) { super.onAuthenticationSucceeded(result) Toast.makeText( getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT ).show() } fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText( getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT ) .show() } }) promptInfo = Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build() // Prompt appears when user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. val biometricLoginButton: Button = findViewById(R.id.biometric_login) biometricLoginButton.setOnClickListener { view -> biometricPrompt.authenticate( promptInfo ) } }
Java
private Executor executor; private BiometricPrompt biometricPrompt; private BiometricPrompt.PromptInfo promptInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(MainActivity.this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(getApplicationContext(), "Authentication error: " + errString, Toast.LENGTH_SHORT) .show(); } @Override public void onAuthenticationSucceeded( @NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT) .show(); } }); promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build(); // Prompt appears when the user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. Button biometricLoginButton = findViewById(R.id.biometric_login); biometricLoginButton.setOnClickListener(view -> { biometricPrompt.authenticate(promptInfo); }); }
Рекомендации
Рекомендуем начать с практической работы, чтобы узнать больше о биометрии.
В зависимости от ваших целей вы можете реализовать диалоговое окно с явным действием пользователя или без него. Чтобы избежать мошенничества, рекомендуем добавлять диалоговое окно биометрической аутентификации с явным действием пользователя для каждой транзакции. Мы понимаем, что добавление аутентификации может усложнить взаимодействие с пользователем, но, учитывая характер информации, обрабатываемой при банковской транзакции, и то, что биометрическая аутентификация проще других методов аутентификации, мы считаем необходимым добавить этот уровень навигации.
Подробнее о биометрической аутентификации…
Ключи доступа
Ключи доступа – это более безопасная и простая альтернатива паролям. Ключи доступа используют криптографию с открытым ключом, чтобы пользователи могли входить в приложения и на сайты с помощью блокировки экрана на устройстве, например отпечатка пальца или распознавания лица. Это избавляет пользователя от необходимости запоминать пароли и управлять ими, а также значительно повышает безопасность.
Ключи доступа позволяют выполнить многофакторную аутентификацию за один шаг, заменяя пароль и одноразовые коды. Это обеспечивает надежную защиту от фишинговых атак и избавляет пользователей от необходимости вводить одноразовые коды из SMS или приложений. Поскольку ключи доступа стандартизированы, единая реализация позволяет использовать беспарольный доступ на всех устройствах, браузерах и операционных системах пользователей.
На устройствах Android ключи доступа поддерживаются благодаря библиотеке Jetpack Менеджера учетных данных, которая объединяет основные способы аутентификации, включая ключи доступа, пароли и интегрированный вход (например, вход с аккаунтом Google).
Как это помогает бороться с мошенничеством
Ключи доступа защищают вас от фишинговых атак, поскольку работают только в зарегистрированных приложениях и на сайтах.
Основной компонент ключа доступа – криптографический закрытый ключ. Обычно закрытый ключ хранится только на ваших устройствах, например ноутбуках или мобильных телефонах, и синхронизируется между ними с помощью поставщиков учетных данных (также известных как менеджеры паролей), таких как Google Менеджер паролей. При создании ключа доступа онлайн-сервис сохраняет только соответствующий открытый ключ. При входе сервис использует закрытый ключ, чтобы подписать запрос от открытого ключа. Это может быть только одно из ваших устройств. Кроме того, для этого вам нужно разблокировать устройство или хранилище учетных данных, что предотвращает несанкционированный вход (например, с украденного телефона).
Чтобы предотвратить несанкционированный доступ в случае кражи разблокированного устройства, ключи доступа должны быть связаны с разумным окном тайм-аута аутентификации. Злоумышленник, укравший устройство, не должен иметь возможность использовать приложение только потому, что предыдущий пользователь вошел в систему. Вместо этого срок действия учетных данных должен истекать через регулярные интервалы (например, каждые 15 минут), и пользователям должно быть предложено подтвердить свою личность путем повторной аутентификации с помощью блокировки экрана.
Если ваш телефон украдут, ключи доступа защитят вас, потому что воры не смогут украсть ваши пароли, чтобы использовать их на других устройствах. Ключи доступа привязаны к конкретному устройству. Если вы используете Google Менеджер паролей и у вас украли телефон, вы можете войти в аккаунт Google с другого устройства (например, компьютера) и удаленно выйти из аккаунта на украденном телефоне. Это сделает Google Менеджер паролей на украденном телефоне непригодным для использования, включая любые сохраненные ключи доступа.
В худшем случае, если украденное устройство не будет восстановлено, ключи доступа будут синхронизированы обратно с новым устройством поставщиком учетных данных, который создал и синхронизировал ключ доступа. Например, если пользователь создал ключ доступа в Google Менеджере паролей, то для доступа к ключу на новом устройстве ему нужно будет войти в аккаунт Google и разблокировать экран предыдущего устройства.
Подробнее о безопасности ключей доступа в Google Менеджере паролей…
Реализация
Ключи доступа поддерживаются на устройствах с Android 9 (уровень API 28) или более поздней версии. Пароли и функция "Войти с аккаунтом Google" поддерживаются на устройствах с Android 4.4 и более поздними версиями. Чтобы начать использовать ключи доступа, выполните следующие действия:
- Пройдите практическую работу по Менеджеру учетных данных, чтобы получить базовое представление о том, как внедрить ключи доступа.
- Ознакомьтесь с рекомендациями по дизайну интерфейса для ключей доступа. В этом документе показано, какие процессы рекомендуются для вашего случая использования.
- Изучите руководство по Менеджеру учетных данных.
- Запланируйте внедрение Менеджера учетных данных и ключей доступа в приложение. Добавьте поддержку связей цифровых объектов.
Подробную информацию о том, как создавать и регистрировать ключи доступа, а также выполнять аутентификацию с их помощью, вы найдете в документации для разработчиков.
Безопасный сброс настроек аккаунта
Злоумышленник, получивший доступ к разблокированному устройству (например, если телефон был украден), попытается открыть приложения с конфиденциальными данными, особенно банковские или платежные. Если в приложении реализована биометрическая проверка, злоумышленник попытается сбросить настройки аккаунта, чтобы получить доступ. При сбросе аккаунта не следует полагаться только на информацию, которая легко доступна на устройстве, например на ссылки для сброса, отправленные по электронной почте или в SMS.
Вот несколько рекомендаций, которые можно использовать при сбросе пароля в приложении:
- Распознавание лиц в дополнение к одноразовому коду
- Вопросы безопасности
- Фактор знания (например, девичья фамилия матери, город рождения или любимая песня).
- Удостоверение личности
SMS Retriever API
SMS Retriever API позволяет автоматически выполнять в приложении Android проверку пользователей по SMS. В этом случае пользователю не придется вводить коды подтверждения вручную. Кроме того, этот API не запрашивает у пользователя дополнительные, потенциально опасные разрешения для приложения, такие как RECEIVE_SMS или READ_SMS. Однако SMS не должны быть единственным способом подтверждения личности пользователя для защиты от несанкционированного локального доступа к устройству.
Как это помогает бороться с мошенничеством
Некоторые пользователи используют коды из SMS как единственный фактор аутентификации, что упрощает мошенникам доступ к аккаунту.
SMS Retriever API позволяет приложению напрямую получать код из SMS без участия пользователя и обеспечивает определенный уровень защиты от мошенничества.
Реализация
Чтобы реализовать SMS Retriever API, нужно выполнить действия на стороне Android и сервера.
Android (руководство)
- Получите номер телефона пользователя.
- Запустите клиент для получения SMS.
- Отправьте номер телефона на свой сервер.
- Получать сообщения с кодами подтверждения.
- Отправьте одноразовый код на свой сервер.
Сервер (руководство)
- Создайте сообщение для подтверждения.
- Отправить сообщение с кодом подтверждения в SMS.
- Подтвердите одноразовый код, когда он будет возвращен.
Рекомендации
После интеграции приложения и подтверждения номера телефона пользователя с помощью SMS Retriever API приложение пытается получить одноразовый код. Если это удается, то это сильный сигнал о том, что SMS было получено на устройстве автоматически. Если этого не происходит и пользователю приходится вводить одноразовый код вручную, это может быть признаком мошенничества.
SMS не следует использовать в качестве единственного механизма проверки пользователя, поскольку это оставляет возможность для локальных атак, например, когда злоумышленник крадет разблокированное устройство, или атак с клонированием SIM-карты. Рекомендуется по возможности использовать биометрические данные. На устройствах, где биометрические датчики недоступны, аутентификация пользователя должна опираться как минимум на один фактор, который нелегко получить с текущего устройства.
Подробнее…
Дополнительные рекомендации вы найдете в следующих статьях:
- Документация по безопасности Android
- Документация по Play Integrity API
- Изменения в Android 15
- Рекомендации по защите от мошеннических звонков от Monzo Bank