Как сделать чтобы код из смс автоматически вставлялся

Добавил пользователь Alex
Обновлено: 04.10.2024

Представим, что перед вами стоит задача организовать аутентификацию пользователя (в мобильном приложении, в первую очередь) так, как это сделано в Telegram/Viber/WhatsApp. А именно реализовать в API возможность осуществить следующие шаги:

  • Пользователь вводит свой номер телефона и ему на телефон приходит СМС с кодом.
  • Пользователь вводит код из СМС и приложение его аутентифицирует и авторизует.
  • Пользователь открывает приложение повторно, и он уже аутентифицирован и авторизован.

Мне потребовалось некоторое количество времени, чтобы осознать, как правильно это сделать. Моя задача — поделиться наработанным с вами в надежде, что это сэкономит кому-то времени.

Мы поговорим о тех изменениях, которые следует проделать в API, о том, как реализовать одноразовые пароли на сервере, как обеспечить безопасность (в т.ч. защиту от перебора) и в какую сторону смотреть при реализации это функциональности на мобильном клиенте.

В сущности требуется добавить три метода в ваше API:

1. Запросить СМС с кодом на номер, в ответ — токен для последующих действий.

Действие соответствует CREATE в CRUD.

Если всё прошло, как ожидается, возвращаем код состояния 200.

Если же нет, то есть одно разумное исключение (помимо стандартной 500 ошибки при проблемах на сервере и т.п. — некорректно указан телефон. В этом случае:

2. Подтвердить токен с помощью кода из СМС.

Действие соответствует UPDATE в CRUD.

Аналогично. Если всё ок — код 200.

Если же нет, то варианты исключений:

3. Форсированная отправка кода повторно.

Аналогично. Если всё ок — код 200.

Если же нет, то варианты исключений:

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

Вам потребуется хранить специальный ключ для проверки СМС-кодов. Существует алгоритм TOTP, который, цитирую Википедию:

OATH-алгоритм создания одноразовых паролей для защищенной аутентификации, являющийся улучшением HOTP (HMAC-Based One-Time Password Algorithm). Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Главное отличие TOTP от HOTP это генерация пароля на основе времени, то есть время является параметром[1]. При этом обычно используется не точное указание времени, а текущий интервал с установленными заранее границами (например, 30 секунд).

Пример кода на руби, чтобы было понятно о чём речь:

Алгоритм описан в стандарте RFC6238, и существует масса реализацией этого алгоритма для многих языков: для Ruby и Rails, для Python, для PHP и т.д..

Строго говоря, Telegram и компания не используют TOTP, т.к. при регистрации там, вас не ограничивают по времени 30-ю секундами. В связи с этим предлагается рассмотреть альтернативный алгоритм OTP, который выдает разные пароли, базируясь на неком счётчике, но не на времени. Встречаем, HOTP:

HOTP (HMAC-Based One-Time Password Algorithm) — алгоритм защищенной аутентификации с использованием одноразового пароля (One Time Password, OTP). Основан на HMAC (SHA-1). Является алгоритмом односторонней аутентификации, а именно: сервер производит аутентификацию клиента.

HOTP генерирует ключ на основе разделяемого секрета и не зависящего от времени счетчика.

HOTP описан в стандарте RFC4226 и поддерживается тем же набором библиотек, что представлен выше. Пример кода на руби:

Далее, самым очевидным вектором атаки является прямой перебор. Вот что пишут в параграфе 7.3 авторы стандарта HOTP (на котором базируется TOTP) на эту тему:

Truncating the HMAC-SHA-1 value to a shorter value makes a brute force attack possible. Therefore, the authentication server needs to detect and stop brute force attacks.

We RECOMMEND setting a throttling parameter T, which defines the maximum number of possible attempts for One-Time Password validation. The validation server manages individual counters per HOTP device in order to take note of any failed attempt. We RECOMMEND T not to be too large, particularly if the resynchronization method used on the server is window-based, and the window size is large. T SHOULD be set as low as possible, while still ensuring that usability is not significantly impacted.

Another option would be to implement a delay scheme to avoid a brute force attack. After each failed attempt A, the authentication server would wait for an increased T*A number of seconds, e.g., say T = 5, then after 1 attempt, the server waits for 5 seconds, at the second failed attempt, it waits for 5*2 = 10 seconds, etc.

The delay or lockout schemes MUST be across login sessions to prevent attacks based on multiple parallel guessing techniques.

Если кратко, то от прямого перебора алгоритм априори не защищает и надо такие вещи предотвращать на уровне сервера. Авторы предлагают несколько решений:

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

Мнение, что можно полагаться только на то, что код живёт ограниченное число секунд, и будет безопасно, т.к. код сбрасывается — ошибочно. Даже, если есть фиксированное ограничение на число попыток в секунду.

Посмотрим на примере. Пусть код TOTP состоит из 6 цифр — это 1000000 возможных вариантов. И пусть разрешено вводить 1 код в 1 секунду, а код живёт 30 секунд.

Шанс, что за 30 попыток в 30 секунд будет угадан код — 3/100000 ~ 0.003%. Казалось бы мало. Однако, таких 30-ти секундных окон в сутках — 2880 штук. Итого, у нас вероятность угадать код (даже несмотря на то, что он меняется) = 1 — (1 — 3/100000)^2880 ~ 8.2%. 10 дней таких попыток уже дают 57.8% успеха. 28 дней — 91% успеха.

Так что надо чётко осознавать, что необходимо реализовать хотя бы одну (а лучше обе) меры, предложенные авторами стандарта.

Не стоит забывать и о стойкости ключа. Авторы в параграфе 4 обязывают длину ключа быть не менее 128 бит, а рекомендованную длину устанавливают в 160 бит (на данный момент неатакуемая длина ключа).

R6 — The algorithm MUST use a strong shared secret. The length of the shared secret MUST be at least 128 bits. This document RECOMMENDs a shared secret length of 160 bits.

Итого, в модели (или в таблице БД, если угодно) надо хранить:

  1. Телефон: phone (советую использовать библиотеки для унификации телефонного номера, вроде этой для Rails),
  2. Ключ для TOTP: otp_secret_key (читаете подробное README для выбранной библиотеки TOTP),
  3. Токен: token (создаете при первом запросе к API чем-нибудь типа SecureRandom),
  4. Ссылку на пользователя: user_id (если у вас есть отдельная таблица/модель, где хранятся данные пользователя).

В случае Android полученный токен можно хранить в SharedPreferences (почему не AccountManager), а для iOS в KeyChain. См. обсуждение на SoF.

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

Несмотря на то что мы живём в эпоху биометрической идентификации, искоренить пароли нам всё-таки не удалось. Выполнение практически всех важных операций по-прежнему подтверждается кодом. Верификация в мессенджерах, банковские переводы, двухфакторная аутентификация — все эти операции требуют ввода пароля, который к тому же чаще всего состоит только из цифр. Из-за этого их приходится либо перепечатывать, либо копировать из СМС вручную, а потом вставлять в нужное приложение. Но теперь в Android появилась функция, которая будет делать это за вас.


Android научился автоматически заполнять коды верификации

Автозаполнение паролей на Android

Как включить функцию автозаполнения


Автозаполнение паролей из СМС

Опасность автозаполнения паролей

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

Поэтому расскажем немного о том, что надо делать, когда происходит нечто подобное. Итак:

Для начала напомним, что некоторые сайты не позволяют сохранять пароли и учетные данные пользователей. Следовательно, браузер Safari как минимум логин и пароль доступа к такому сайте сохранять не будет и не должен.

Но если менеджер паролей iPhone или iPad не срабатывает на тех сайтах (в приложениях и пр), где ранее работал нормально, то в таком случае предлагаем действовать в следующем порядке:

…на всякий случай. И для этого:

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

Дело в том, что в режиме частного доступа (Private browsing) браузер Safari не сохраняет (и тоже не должен) логины и пароли доступа к онлайн-аккаунтам. Потому, когда автозаполнение на iPhone или iPad явно глючит, то режим этот лучше отключить. Сделать это можно так:

Снова проверяем автозаполнение. Не заработало? Тогда…

Если они отключены (случайно или по ошибке), то автозаполнение, само собой, работать и не будет. Поэтому:

Если и после этого автозаполнение работать не хочет, тогда…

Если не работает автозаполнение паролей в iPhone или iPad

Если ни одна из перечисленных выше мер должного эффекта не возымела, и автозаполнение паролей по-прежнему не работает, то открываем раздел обновления iOS (Настройки > Основные > Обновление ПО) и проверяем наличие более новой версии системы. Возможно, имеет место быть очередная проблема iOS 13 (как и с Wi-Fi и Bluetooth до этого). Тогда можно надеяться, что саппорт Apple и для нее выпустит соответствующий патч. Пока так…


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

У Google уже есть собственная служба управления паролями, которую инструмент автозаполнения Android использует для ввода вашего имени пользователя и пароля в различные приложения и веб-сайты. Он может работать с другими подобными сервисами и инструментами, такими как менеджеры паролей.

Примечание. Служба автозаполнения Google доступна только для Android 8.0 и более новых версий.

Как включить автозаполнение Google

Теперь ваш сервис автозаполнения включен.

Как сохранить учетные данные для входа

  1. Откройте сервис автозаполнения на вашем устройстве.
  2. Откройте настройки Google или стороннего приложения, которое вы выбрали.
  3. Нажмите OK, чтобы подтвердить, когда Google спросит вас, хотите ли вы использовать его в качестве службы автозаполнения по умолчанию.
  4. Введите адрес электронной почты по умолчанию, который вы хотите установить для автозаполнения, а затем нажмите Продолжить.
  5. Введите необходимые данные автоматически при каждом входе в приложения и веб-сайты, например, пароли и имена пользователей.

Как пользоваться услугой автозаполнения

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

Если вы используете стороннее приложение, вы получите предложение разблокировать менеджер паролей и выбрать учетные данные для использования, даже не выходя из экрана входа в систему.


Киберпреступники используют спам на тему коронавируса для.

Cybercrooks извлекает выгоду из глобальной пандемии, чтобы.

Что такое экран приложений и данных на iPhone и как им.

Оставьте Ответ

Продукты

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

Компания

Программные решения для управления данными, разработанные и разработанные для упрощения работы в Интернете.

Cyclonis Backup

The Free Basic Cyclonis Backup plan gives you 2 GB of cloud storage space with full functionality! No credit card required. Need more storage space? Purchase a larger Cyclonis Backup plan today! To learn more about our policies and pricing, see Terms of Service, Privacy Policy, Discount Terms and Purchase Page. If you wish to uninstall the app, please visit the Uninstallation Instructions page.

Cyclonis Password Manager

FREE Trial: 30-Day One-Time Offer! No credit card required for Free Trial. Full functionality for the length of the Free Trial. (Full functionality after Free Trial requires subscription purchase.) To learn more about our policies and pricing, see EULA, Privacy Policy, Discount Terms and Purchase Page. If you wish to uninstall the app, please visit the Uninstallation Instructions page.

Главная

Products

Support

Компания

Легальный

Подписывайтесь на нас

© 2017-2022 Cyclonis Ltd. CYCLONIS является торговой маркой Cyclonis Ltd. Все права защищены.

Читайте также: