Безопасная аутентификация пользователя

Чтобы защитить свою систему аутентификации в Android, рассмотрите возможность отказа от модели на основе паролей, особенно для конфиденциальных учетных записей, таких как банковские учетные записи и учетные записи электронной почты ваших пользователей. Помните, что некоторые приложения, которые устанавливают ваши пользователи, могут иметь не самые благие намерения и могут пытаться обмануть ваших пользователей.

Также не думайте, что устройством будут пользоваться только авторизованные пользователи. Кража телефона является распространенной проблемой, и злоумышленники нацелены на разблокированные устройства, чтобы получить прибыль непосредственно от пользовательских данных или финансовых приложений. Мы предлагаем всем конфиденциальным приложениям реализовать разумный тайм-аут аутентификации (15 минут?) с биометрической проверкой и требовать дополнительную аутентификацию перед конфиденциальными действиями, такими как денежные переводы.

Диалоговое окно биометрической аутентификации

Библиотека биометрии предлагает набор функций для отображения запроса на биометрическую аутентификацию, например распознавание лиц или отпечатков пальцев. Однако биометрические подсказки можно настроить так, чтобы они возвращались к LSKF, которая имеет известные риски несанкционированного доступа . Для конфиденциальных приложений мы рекомендуем не использовать биометрический возврат к PIN-коду, а после исчерпания биометрических повторных попыток пользователи могут подождать или повторно войти в систему с паролем или сбросить учетные записи. Для сброса учетной записи должны потребоваться факторы, которые труднодоступны на устройстве (рекомендации ниже).

Как это помогает снизить риск мошенничества и кражи телефонов

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

Для дополнительного уровня безопасности мы рекомендуем разработчикам приложений запрашивать биометрическую аутентификацию класса 3 и использовать CryptoObject для банковских и финансовых транзакций.

Выполнение

  1. Обязательно включите библиотеку androidx.biometric.
  2. Включите диалоговое окно биометрического входа в действие или фрагмент, содержащий логику, по которой вы хотите, чтобы пользователь прошел аутентификацию.

Котлин


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
    )
  }
}

Ява


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);
    });
}

Лучшие практики

Мы рекомендуем вам начать с лаборатории кода , чтобы узнать больше о биометрии.

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

Узнайте больше о биометрической аутентификации .

Ключи доступа

Ключи доступа — более безопасная и простая альтернатива паролям. В ключах доступа используется криптография с открытым ключом, чтобы пользователи могли входить в приложения и на веб-сайты с помощью механизма блокировки экрана своего устройства, такого как отпечаток пальца или распознавание лица. Это освобождает пользователя от необходимости запоминать пароли и управлять ими, а также обеспечивает значительно повышенную безопасность.

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

В Android ключи доступа поддерживаются с помощью библиотеки Credential Manager Jetpack, которая объединяет основные методы аутентификации, включая ключи доступа, пароли и федеративный вход (например, вход с помощью Google).

Как это помогает снизить риск мошенничества

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

Основным компонентом ключа доступа является криптографический закрытый ключ. Обычно этот закрытый ключ находится исключительно на ваших устройствах, таких как ноутбуки или мобильные телефоны, и синхронизируется между ними поставщиками учетных данных (также известными как менеджеры паролей), такими как Google Password Manager. При создании ключа доступа онлайн-сервис сохраняет только соответствующий открытый ключ. Во время входа в систему служба использует закрытый ключ для подписи запроса на основе открытого ключа. Это может произойти только с одного из ваших устройств. Кроме того, чтобы это произошло, вам необходимо разблокировать свое устройство или хранилище учетных данных, что предотвращает несанкционированный вход в систему (например, с украденного телефона).

Чтобы предотвратить несанкционированный доступ в случае кражи разблокированного устройства, ключи доступа должны быть связаны с разумным окном тайм-аута аутентификации. Злоумышленник, укравший устройство, не должен иметь возможность использовать приложение только потому, что предыдущий пользователь вошел в систему. Вместо этого срок действия учетных данных должен истекать через регулярные промежутки времени (например, каждые 15 минут), и пользователи должны быть обязаны проверять свою личность посредством повторной аутентификации блокировки экрана.

Если ваш телефон украден, ключи доступа защитят вас, поскольку воры не смогут украсть ваши пароли для использования на других устройствах — ключи доступа зависят от устройства. Если вы используете Менеджер паролей Google и ваш телефон украли, вы можете войти в свою учетную запись Google с другого устройства (например, компьютера) и удаленно выйти из украденного телефона. Это делает менеджер паролей Google на украденном телефоне непригодным для использования, включая все сохраненные ключи доступа.

В худшем случае, если украденное устройство не будет восстановлено, ключи доступа синхронизируются обратно с новым устройством поставщиком учетных данных, который создал и синхронизировал ключ доступа. Например, пользователь мог выбрать Диспетчер паролей Google для создания ключа доступа, и он может получить доступ к своему ключу доступа на новом устройстве, снова войдя в свою учетную запись Google и предоставив блокировку экрана с предыдущего устройства.

Дополнительную информацию см. в статье «Безопасность паролей» в статье «Менеджер паролей Google» .

Выполнение

Ключи доступа поддерживаются на устройствах под управлением Android 9 (уровень API 28) или более поздних версий. Пароли и вход с помощью Google поддерживаются, начиная с Android 4.4. Чтобы начать работу с ключами доступа, выполните следующие действия:

  1. Следуйте лабораторной работе по коду Credential Manager , чтобы получить первоначальное представление о том, как реализовать ключи доступа.
  2. Ознакомьтесь с рекомендациями по разработке пользовательского интерфейса с помощью ключей доступа . В этом документе показано, какие потоки рекомендуются для вашего варианта использования.
  3. Изучите Credential Manager, следуя руководству .
  4. Спланируйте реализацию диспетчера учетных данных и ключей доступа для вашего приложения. Запланируйте добавление поддержки Digital Asset Links .

Дополнительную информацию о создании, регистрации и аутентификации с помощью ключей доступа см. в нашей документации для разработчиков.

Безопасный сброс учетной записи

Несанкционированный злоумышленник, имеющий доступ к разблокированному устройству (например, при краже телефона), попытается получить доступ к конфиденциальным приложениям, особенно банковским или кассовым приложениям. Если приложение реализует биометрическую проверку, злоумышленник попытается сбросить учетную запись, чтобы войти. Очень важно, чтобы процесс сброса учетной записи не полагался исключительно на информацию, которая легко доступна на устройстве, например, ссылки для сброса OTP по электронной почте или SMS.

Вот общие рекомендации, которые вы можете включить в процесс сброса вашего приложения:

  • Распознавание лиц в дополнение к OTP
  • Вопросы безопасности
  • Фактор знаний (например, девичья фамилия матери, город рождения или любимая песня)
  • проверка личности

API SMS-ретривера

API SMS Retriever позволяет автоматически выполнять проверку пользователей с помощью SMS в вашем приложении Android. Таким образом, пользователю не придется вручную вводить коды подтверждения. Кроме того, этот API не запрашивает у пользователя дополнительные, потенциально опасные разрешения для приложений, такие как RECEIVE_SMS или READ_SMS . Однако SMS не следует использовать в качестве единственного средства проверки пользователя для защиты от несанкционированного локального доступа к устройству.

Как это помогает снизить риск мошенничества

Некоторые пользователи используют коды SMS в качестве единственного фактора аутентификации, что обеспечивает легкую точку входа для мошенничества.

API SMS Retriever позволяет приложению напрямую получать код SMS без взаимодействия с пользователем и может обеспечить уровень защиты от мошенничества.

Выполнение

Реализация API SMS Retriever состоит из двух частей: Android и Server.

Android : ( руководство )

  1. Получите номер телефона пользователя.
  2. Запустите клиент получения SMS.
  3. Отправьте номер телефона на ваш сервер.
  4. Получайте подтверждающие сообщения.
  5. Отправьте OTP на ваш сервер.

Сервер : ( руководство )

  1. Создайте проверочное сообщение.
  2. Отправьте подтверждающее сообщение по SMS.
  3. Проверьте OTP, когда он будет возвращен.

Лучшие практики

После интеграции приложения и проверки номера телефона пользователя с помощью API SMS Retriever оно пытается получить OTP. Если это удастся, это сильный сигнал о том, что SMS было получено на устройство автоматически. Если это не удается и пользователю приходится вручную вводить OTP, это может быть предупреждающим знаком о том, что пользователь может столкнуться с мошенничеством.

SMS не следует использовать в качестве единственного механизма проверки пользователя, поскольку оно оставляет место для локальных атак, например, когда злоумышленник грабит разблокированное устройство; или атаки клонирования SIM-карты. По возможности рекомендуется использовать биометрию. На устройствах, где биометрические датчики недоступны, аутентификация пользователя должна основываться как минимум на одном факторе, который нелегко получить от текущего устройства.

Узнать больше

Для получения дополнительной информации о передовом опыте посетите следующие ресурсы: