Организация аутентификации по СМС по примеру Telegram/Viber/WhatsApp. Cvc required
Организация аутентификации по СМС по примеру Telegram/Viber/WhatsApp / Хабр
Представим, что перед вами стоит задача организовать аутентификацию пользователя (в мобильном приложении, в первую очередь) так, как это сделано в Telegram/Viber/WhatsApp. А именно реализовать в API возможность осуществить следующие шаги:
- Пользователь вводит свой номер телефона и ему на телефон приходит СМС с кодом.
- Пользователь вводит код из СМС и приложение его аутентифицирует и авторизует.
- Пользователь открывает приложение повторно, и он уже аутентифицирован и авторизован.
Мне потребовалось некоторое количество времени, чтобы осознать, как правильно это сделать. Моя задача — поделиться наработанным с вами в надежде, что это сэкономит кому-то времени.
Я постараюсь кратко изложить выработанный подход к этому вопросу. Подразумевается, что у вас API, HTTPS и, вероятно, REST. Какой у вас там набор остальных технологий неважно. Если интересно — добро пожаловать под кат.
Мы поговорим о тех изменениях, которые следует проделать в API, о том, как реализовать одноразовые пароли на сервере, как обеспечить безопасность (в т.ч. защиту от перебора) и в какую сторону смотреть при реализации это функциональности на мобильном клиенте.
В сущности требуется добавить три метода в ваше API:
1. Запросить СМС с кодом на номер, в ответ — токен для последующих действий.
Действие соответствует CREATE в CRUD.
POST /api/sms_authentications/ Параметры на вход: phone Параметры на выход: tokenЕсли всё прошло, как ожидается, возвращаем код состояния 200.
Если же нет, то есть одно разумное исключение (помимо стандартной 500 ошибки при проблемах на сервере и т.п. — некорректно указан телефон. В этом случае:
HTTP код состояния: 422 (Unprocessable Entity), в теле ответа: PHONE_NUMBER_INVALID.
2. Подтвердить токен с помощью кода из СМС.
Действие соответствует UPDATE в CRUD.
PUT /api/sms_authentications/<token>/ Параметры на вход: sms_codeАналогично. Если всё ок — код 200.
Если же нет, то варианты исключений:
- Некорректный токен: HTTP код состояния: 404.
- Некорректный код: HTTP код состояния: 422 (Unprocessable Entity), в теле ответа: SMS_CODE_INVALID.
- Телефон уже подтверждён: HTTP код состояния: 422 (Unprocessable Entity), в теле ответа: ALREADY_CONFIRMED.
3. Форсированная отправка кода повторно.
PUT /api/sms_authentications/<token>/resendАналогично. Если всё ок — код 200.
Если же нет, то варианты исключений:
- Некорректный токен: HTTP код состояния: 404.
- Слишком частая отправка (скажем, прошлая отправка была не позднее чем 60 секунд назад): HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: TOO_OFTEN.
Помимо этого, каждый метод API, который требует аутентифицированного пользователя должен получать на вход дополнительный параметр token, который связан с пользователем.
Литература:
- Образец для подражания — API Telegram: https://core.telegram.org/methods
- Дискуссия на SOF: http://stackoverflow.com/questions/12401255/sms-registration-like-in-the-mobile-app-whatsapp
Вам потребуется хранить специальный ключ для проверки СМС-кодов. Существует алгоритм TOTP, который, цитирую Википедию:
OATH-алгоритм создания одноразовых паролей для защищенной аутентификации, являющийся улучшением HOTP (HMAC-Based One-Time Password Algorithm). Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Главное отличие TOTP от HOTP это генерация пароля на основе времени, то есть время является параметром[1]. При этом обычно используется не точное указание времени, а текущий интервал с установленными заранее границами (например, 30 секунд).Грубо говоря, алгоритм позволяет создать одноразовый пароль, отправить его в СМС, и проверить, что присланный пароль верен. Причём сгенерированный пароль будет работать заданное количество времени. При всём при этом не надо хранить эти бесконечные одноразовые пароли и время, когда они будут просрочены, всё это уже заложено в алгоритм и вы храните только ключ.
Пример кода на руби, чтобы было понятно о чём речь:
totp = ROTP::TOTP.new("base32secret3232") totp.now # => "492039" # OTP verified for current time totp.verify("492039") # => true sleep 30 totp.verify("492039") # => falseАлгоритм описан в стандарте 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 и поддерживается тем же набором библиотек, что представлен выше. Пример кода на руби:
hotp = ROTP::HOTP.new("base32secretkey3232") hotp.at(0) # => "260182" hotp.at(1) # => "055283" hotp.at(1401) # => "316439" # OTP verified with a counter hotp.verify("316439", 1401) # => true hotp.verify("316439", 1402) # => falseПервое непреложное само собой разумеющееся правило: ваше API, где туда-сюда гуляют данные и, самое главное, token должно быть завернуто в SSL. Поэтому только HTTPS, никакого HTTP.
Далее, самым очевидным вектором атаки является прямой перебор. Вот что пишут в параграфе 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.
Если кратко, то от прямого перебора алгоритм априори не защищает и надо такие вещи предотвращать на уровне сервера. Авторы предлагают несколько решений:
Отслеживать число неудачных попыток ввода кода, и блокировать возможность аутентификации по превышению некоторого максимального лимита. Лимит предлагают делать настолько маленьким, насколько ещё будет комфортно пользоваться сервисом.
- Установить задержку после неудачной попытки ввода. Причём увеличивать задержку линейно по числу неудачных попыток. К примеру, после первой попытки — установить задержку в 5 секунд, после второй в 10 и т.п..
Мнение, что можно полагаться только на то, что код живёт ограниченное число секунд, и будет безопасно, т.к. код сбрасывается — ошибочно. Даже, если есть фиксированное ограничение на число попыток в секунду.
Посмотрим на примере. Пусть код 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.Итого, в модели (или в таблице БД, если угодно) надо хранить:
- Телефон: phone (советую использовать библиотеки для унификации телефонного номера, вроде этой для Rails),
- Ключ для TOTP: otp_secret_key (читаете подробное README для выбранной библиотеки TOTP),
- Токен: token (создаете при первом запросе к API чем-нибудь типа SecureRandom),
- Ссылку на пользователя: user_id (если у вас есть отдельная таблица/модель, где хранятся данные пользователя).
В случае Android полученный токен можно хранить в SharedPreferences (почему не AccountManager), а для iOS в KeyChain. См. обсуждение на SoF.
Вышеописанный подход позволит вам в рамках вашего стека технологий реализовать указанную задачу. Если вас есть соображения по этому подходу или альтернативные подходы, то прошу поделиться в комментариях. Аналогичная просьба, если у вас есть примеры документации к безопасным
habr.com
Организация аутентификации по СМС по примеру Telegram/Viber/WhatsApp / СоХабр
Представим, что перед вами стоит задача организовать аутентификацию пользователя (в мобильном приложении, в первую очередь) так, как это сделано в Telegram/Viber/WhatsApp. А именно реализовать в API возможность осуществить следующие шаги:
- Пользователь вводит свой номер телефона и ему на телефон приходит СМС с кодом.
- Пользователь вводит код из СМС и приложение его аутентифицирует и авторизует.
- Пользователь открывает приложение повторно, и он уже аутентифицирован и авторизован.
Мне потребовалось некоторое количество времени, чтобы осознать, как правильно это сделать. Моя задача — поделиться наработанным с вами в надежде, что это сэкономит кому-то времени.
Я постараюсь кратко изложить выработанный подход к этому вопросу. Подразумевается, что у вас API, HTTPS и, вероятно, REST. Какой у вас там набор остальных технологий неважно. Если интересно — добро пожаловать под кат.
Мы поговорим о тех изменениях, которые следует проделать в API, о том, как реализовать одноразовые пароли на сервере, как обеспечить безопасность (в т.ч. защиту от перебора) и в какую сторону смотреть при реализации это функциональности на мобильном клиенте.
В сущности требуется добавить три метода в ваше API:
1. Запросить СМС с кодом на номер, в ответ — токен для последующих действий.
Действие соответствует CREATE в CRUD.
POST /api/sms_authentications/ Параметры на вход: phone Параметры на выход: tokenЕсли всё прошло, как ожидается, возвращаем код состояния 200.
Если же нет, то есть одно разумное исключение (помимо стандартной 500 ошибки при проблемах на сервере и т.п. — некорректно указан телефон. В этом случае:
HTTP код состояния: 422 (Unprocessable Entity), в теле ответа: PHONE_NUMBER_INVALID.
2. Подтвердить токен с помощью кода из СМС.
Действие соответствует UPDATE в CRUD.
PUT /api/sms_authentications/<token>/ Параметры на вход: sms_codeАналогично. Если всё ок — код 200.
Если же нет, то варианты исключений:
- Некорректный токен: HTTP код состояния: 404.
- Некорректный код: HTTP код состояния: 422 (Unprocessable Entity), в теле ответа: SMS_CODE_INVALID.
- Телефон уже подтверждён: HTTP код состояния: 422 (Unprocessable Entity), в теле ответа: ALREADY_CONFIRMED.
3. Форсированная отправка кода повторно.
PUT /api/sms_authentications/<token>/resendАналогично. Если всё ок — код 200.
Если же нет, то варианты исключений:
- Некорректный токен: HTTP код состояния: 404.
- Слишком частая отправка (скажем, прошлая отправка была не позднее чем 60 секунд назад): HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: TOO_OFTEN.
Помимо этого, каждый метод API, который требует аутентифицированного пользователя должен получать на вход дополнительный параметр token, который связан с пользователем.
Литература:
- Образец для подражания — API Telegram: https://core.telegram.org/methods
- Дискуссия на SOF: http://stackoverflow.com/questions/12401255/sms-registration-like-in-the-mobile-app-whatsapp
Вам потребуется хранить специальный ключ для проверки СМС-кодов. Существует алгоритм TOTP, который, цитирую Википедию:
OATH-алгоритм создания одноразовых паролей для защищенной аутентификации, являющийся улучшением HOTP (HMAC-Based One-Time Password Algorithm). Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Главное отличие TOTP от HOTP это генерация пароля на основе времени, то есть время является параметром[1]. При этом обычно используется не точное указание времени, а текущий интервал с установленными заранее границами (например, 30 секунд).Грубо говоря, алгоритм позволяет создать одноразовый пароль, отправить его в СМС, и проверить, что присланный пароль верен. Причём сгенерированный пароль будет работать заданное количество времени. При всём при этом не надо хранить эти бесконечные одноразовые пароли и время, когда они будут просрочены, всё это уже заложено в алгоритм и вы храните только ключ.
Пример кода на руби, чтобы было понятно о чём речь:
totp = ROTP::TOTP.new("base32secret3232") totp.now # => "492039" # OTP verified for current time totp.verify("492039") # => true sleep 30 totp.verify("492039") # => falseАлгоритм описан в стандарте 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 и поддерживается тем же набором библиотек, что представлен выше. Пример кода на руби:
hotp = ROTP::HOTP.new("base32secretkey3232") hotp.at(0) # => "260182" hotp.at(1) # => "055283" hotp.at(1401) # => "316439" # OTP verified with a counter hotp.verify("316439", 1401) # => true hotp.verify("316439", 1402) # => falseПервое непреложное само собой разумеющееся правило: ваше API, где туда-сюда гуляют данные и, самое главное, token должно быть завернуто в SSL. Поэтому только HTTPS, никакого HTTP.
Далее, самым очевидным вектором атаки является прямой перебор. Вот что пишут в параграфе 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.
Если кратко, то от прямого перебора алгоритм априори не защищает и надо такие вещи предотвращать на уровне сервера. Авторы предлагают несколько решений:
Отслеживать число неудачных попыток ввода кода, и блокировать возможность аутентификации по превышению некоторого максимального лимита. Лимит предлагают делать настолько маленьким, насколько ещё будет комфортно пользоваться сервисом.
- Установить задержку после неудачной попытки ввода. Причём увеличивать задержку линейно по числу неудачных попыток. К примеру, после первой попытки — установить задержку в 5 секунд, после второй в 10 и т.п..
Мнение, что можно полагаться только на то, что код живёт ограниченное число секунд, и будет безопасно, т.к. код сбрасывается — ошибочно. Даже, если есть фиксированное ограничение на число попыток в секунду.
Посмотрим на примере. Пусть код 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.Итого, в модели (или в таблице БД, если угодно) надо хранить:
- Телефон: phone (советую использовать библиотеки для унификации телефонного номера, вроде этой для Rails),
- Ключ для TOTP: otp_secret_key (читаете подробное README для выбранной библиотеки TOTP),
- Токен: token (создаете при первом запросе к API чем-нибудь типа SecureRandom),
- Ссылку на пользователя: user_id (если у вас есть отдельная таблица/модель, где хранятся данные пользователя).
В случае Android полученный токен можно хранить в SharedPreferences (почему не AccountManager), а для iOS в KeyChain. См. обсуждение на SoF.
Вышеописанный подход позволит вам в рамках вашего стека технологий реализовать указанную задачу. Если вас есть соображения по этому подходу или альтернативные подходы, то прошу поделиться в комментариях. Аналогичная просьба, если у вас есть примеры документации к безопасным
sohabr.net
SMS нельзя использовать в качестве средства аутентификации / Блог компании Positive Technologies / Хабр
Американский институт стандартов и технологий (NIST) выступил за отказ от использования SMS в качестве одного из элементов двухфакторной аутентификации. В очередном черновике стандарта Digtial Authentication Guideline представители ведомства указывают, что «[внеполосная аутентификация] с помощью SMS будет запрещена стандартом и не будет допускаться в его последующих изданиях».
Документ не является обязательным, но в соответствии со стандартами NIST строят свою инфраструктуру многие государственные учреждения и компании США, поэтому такое решение может серьезно изменить подходы к обеспечению информационной безопасности уже в ближайшем будущем.
Под внеполосной аутентификацией здесь подразумевается использование второго устройства для идентификации личности пользователя.
Почему SMS нельзя использовать для аутентификации
В документе NIST напрямую не указаны причины того, почему SMS не следует использовать в качестве элементов двухфакторной системы аутентификации. Тем не менее, очевидно, что представители Института учли в черновике многочисленные сообщения о взломах и перехватах SMS.В частности, широкую огласку получила история с взломом Telegram-аккаунтов российских оппозиционеров. О том, что система авторизации по SMS в мессенджере возможно скомпрометирована заявил Павел Дуров. По мнению создателя Telegram, атака не могла быть осуществлена без вмешательства спецслужб. Однако эксперты Positive Technologies провели собственное исследование, в результате которого им удалось перехватить коды аутентификации Telegram и WhatsApp с помощью уязвимостей сетей SS7.
В результате был получен полный доступ к учетным записям в мессенджере — осуществивший подобную атаку злоумышленник сможет не только перехватывать данные, но и вести переписку от имени жертвы.
Кроме того, ранее мы публиковали результаты исследования защищенности сетей SS7. Итоговый уровень безопасности сетей SS7 всех исследованных операторов мобильной связи оказался крайне невысок. В 2015 году в отношении операторов связи и их сетей SS7 могли быть реализованы атаки, связанные с утечкой данных абонентов (77% успешных попыток), нарушениями в работе сети (80%) и мошенническими действиями (67%).
Популярность этой темы легко проверить. Соответствующие запросы в поисковых системах выдают ссылки на специализированные ресурсы в закрытом интернете:
В закрытом сегменте сети можно найти массу сервисов для взлома SS7:
Заказы на подобные взломы также размещаются вполне открыто:
Кроме того, уязвимостям подвержены не только технологические сети SS7, но и алгоритмы шифрования радиоинтерфейса. Атаки на сеть SS7 можно осуществлять из любой точки мира, а возможности злоумышленника не ограничиваются взломом мессенджеров. И сейчас все эти атаки становятся доступны не только спецслужбам, но и злоумышленникам, никак не связанным с государством.
Что теперь будет
Лучшие практики, публикуемые NIST не являются юридически обязывающими стандартами. Однако многие государственные ведомства и агентства США следуют им, что также делают и многие компании, представляющие ИТ-отрасль. Поэтому многие из них после столь однозначеного вердикта Института стандартов и технологий начнут присматриваться к альтернативным способам аутентификации, помимо SMS.Среди таких альтернатив, к примеру, приложения, доставляющие пользователям двухфакторные коды, обновляющиеся каждые 30 секунд — среди них такие, как Google Authenticator, Authy, Duo. Крупные корпорации разрабатывают инструменты, которые работают на основе похожих принципов (RSA SecureID).
Тем не менее, полного и повсеместного отказа от систем аутентификации, основанных на применении SMS в ближайшем будущем не произойдет. Однако постепенно будет расти число сервисов, которые поддерживают двухфакторную аутентификацию не только через SMS, но и внутри своих приложений. И именно такие системы будут показывать лучшие результаты в деле обеспечения безопасности пользователей.
habr.com
Двухфакторная аутентификация с помощью СМС
Что являет собой двухфакторная аутентификация
Двухфакторная аутентификация – это один из методов идентификации пользователя (чаще в сего в Сети), который защищает его учётные записи от взлома. При этом используется двухслойная, то есть более эффективная защита учетной записи.
Обычно она сводится к тому, что помимо привычных логина и пароля используется случайно сгенерированный код, который отправляют пользователю по СМС (не единственный, но распространённый способ). То есть, по сути, необходимо подтвердить дважды, что вы – тот, за кого себя выдаёте. Ведь если хакер и взломает ваш пароль, то без доступа к вашему телефону, ему вряд ли удастся войти в аккаунт.
Так что двухфакторная аутентификация на сегодняшний день – один из самых надёжных механизмов защиты от несанкционированного проникновения.
Кому следует использовать двухфакторную аутентификацию
Банки, платёжные системы
Само собой, финансовые операции требуют надёжной защиты. Двухэтапная аутентификация пользователей обеспечит сохранность данных клиентских кредитных карт и, разумеется, их денежных средств.
Онлайн сервисы
Вирусы, шпионские программы, фишинговые атаки… Уловки хакеров всё сложнее и тоньше. Во избежание неприятных инцидентов лучше использовать сервис смс активации, ведь запрос аутентификационных данных 2-х разных типов вместо одного — простая и логичная перестраховка.
Клиники, лаборатории
Для серьёзных медучреждений, которым действительно важна конфиденциальность и безопасность данных своих пациентов, двухфакторная аутентификация через SMS – отличное решение.
Электронная коммерция
Используя двухфакторную аутентификацию, вы повысите безопасность своего e-commerce проекта. Ваши клиенты, чувствуя себя защищёнными, будут в значительно большей степени расположены к покупке.
Юридические фирмы
В работе юристов абсолютное соблюдение вверенных тайн – ключевой момент. Потому в этой сфере крайне важно обеспечить сохранность конфиденциальных сведений клиентов. И в ваших силах усилить защитных механизм.
Бизнес
Корпоративный шпионаж – довольно распространённое явление, порой – с катастрофическим исходом. Гораздо проще и дешевле предотвратить проблему, нежели исправлять её последствия. Особенно, учитывая наличие простого и надёжного способа защиты базы данных компании – двухфазную аутентификацию с помощью СМС.
Что можно защищать с помощью двухфакторной аутентификации
- Персональные данные
- Интеллектуальную собственность
- Финансовую информацию
- Данные кредитных карт
- Юридическую документацию
- Результаты клинических обследований, анализов
- Документация кадрового отдела и пр.
Используйте надёжный смс-сервис для внедрения двухэтапной аутентификации
Что может предложить вам СМС Клуб Украина:
- Легко настраиваемую смс-платформу
- Точную оперативную доставку SMS
- Международный охват – более чем в 200 странах
- Детальную онлайн-статистику
- Техподдержку 24/7/365
По всем вопросам обращайтесь к нашим менеджерам!
Двухфакторная аутентификация через СМС
Оцените этот постblog.smsclub.mobi
Организация аутентификации по СМС по примеру Telegram-Viber-WhatsApp
Представим, что перед вами стоит задача организовать аутентификацию пользователя (в мобильном приложении, в первую очередь) так, как это сделано в Telegram/Viber/WhatsApp. А именно реализовать в API возможность осуществить следующие шаги:
- Пользователь вводит свой номер телефона и ему на телефон приходит СМС с кодом.
- Пользователь вводит код из СМС и приложение его аутентифицирует и авторизует.
- Пользователь открывает приложение повторно, и он уже аутентифицирован и авторизован.
Я постараюсь кратко изложить выработанный подход к этому вопросу. Подразумевается, что у вас API, HTTPS и, вероятно, REST. Какой у вас там набор остальных технологий неважно. Если интересно — добро пожаловать под кат.
Изменения в API
В сущности требуется добавить два добавить три метода в ваше API:
- Запросить СМС с кодом на номер, в ответ — токен для последующих действий.
Действие соответствует CREATE в CRUD.
POST /api/sms_authentications/ Параметры на вход: phone Параметры на выход: tokenЕсли всё прошло, как ожидается, возвращаем код состояния 200.
Если же нет, то есть одно разумное исключение (помимо стандартной 500 ошибки при проблемах на сервере и т.п. — некорректно указан телефон. В этом случае:
HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: PHONE_NUMBER_INVALID.
- Подтвердить токен с помощью кода из СМС.
Действие соответствует UPDATE в CRUD.
PUT /api/sms_authentications/<token>/ Параметры на вход: sms_codeАналогично. Если всё ок — код 200.
Если же нет, то варианты исключений:
- Некорректный токен: HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: TOKEN_INVALID.
- Некорректный код: HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: SMS_CODE_INVALID.
- Форсированная отправка кода повторно.
Аналогично. Если всё ок — код 200.
Если же нет, то варианты исключений:
- Некорректный токен: HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: TOKEN_INVALID.
- Слишком частая отправка (скажем, прошлая отправка была не позднее чем 60 секунд назад): HTTP код состояния: 400 (BAD_REQUEST), в теле ответа: TOO_OFTEN.
Помимо этого, каждый метод API, который требует аутентифицированного пользователя должен получать на вход дополнительный параметр token, который связан с пользователем.
Литература:
- Образец для подражания — API Telegram: https://core.telegram.org/methods
- Дискуссия на SOF: http://stackoverflow.com/questions/12401255/sms-registration-like-in-the-mobile-app-whatsapp
Изменения в коде сервера
Вам потребуется хранить специальный ключ для проверки СМС-кодов. Существует алгоритм TOTP, который позволяет, цитирую Википедию:
OATH-алгоритм создания одноразовых паролей для защищенной аутентификации, являющийся улучшением HOTP (HMAC-Based One-Time Password Algorithm). Является алгоритмом односторонней аутентификации — сервер удостоверяется в подлинности клиента. Главное отличие TOTP от HOTP это генерация пароля на основе времени, то есть время является параметром[1]. При этом обычно используется не точное указание времени, а текущий интервал с установленными заранее границами (например, 30 секунд).
Грубо говоря, алгоритм позволяет создать одноразовый пароль, отправить его в СМС, и проверить, что присланный пароль верен. Причём сгенерированный пароль будет работать заданное количество времени. При всём при этом не надо хранить эти бесконечные одноразовые пароли и время, когда они будут просрочены, всё это уже заложено в алгоритм и вы храните только ключ.
Пример кода на руби, чтобы было понятно о чём речь:
totp = ROTP::TOTP.new("base32secret3232") totp.now # => "492039" # OTP verified for current time totp.verify("492039") # => true sleep 30 totp.verify("492039") # => falseСуществует масса реализацией этого алгоритма для многих языков: для Ruby и Rails, для Python, для PHP и т.д..
Итого, в модели (или в таблице БД, если угодно) надо хранить:
- Телефон: phone (советую использовать библиотеки для унификации телефонного номера, вроде этой для Rails),
- Ключ для TOTP: otp_secret_key (читаете подробное README для выбранной библиотеки TOTP),
- Токен: token (создаете при первом запросе к API чем-нибудь типа SecureRandom),
- Ссылку на пользователя: user_id (если у вас есть отдельная таблица/модель, где хранятся данные пользователя).
Особенности реализации мобильного приложения
В случае Android полученный токен можно хранить в SharedPreferences, а для iOS в KeyChain. См. обсуждение на SoF.
Заключение
Вышеописанный подход позволит вам в рамках вашего стека технологий реализовать указанную задачу. Если вас есть соображения по этому подходу или альтернативные подходы, то прошу поделиться в комментариях. Аналогичная просьба, если у вас есть примеры документации к безопасным системам хранения в других мобильных ОС.
Автор: mpetrunin
Источник
www.pvsm.ru
Двухфакторная аутентификация: если не СМС, то что
О том, почему СМС — самый небезопасный метод двухфакторной аутентификации и чем его заменить.
Двухфакторная аутентификация — надёжный способ повысить безопасность в интернете. Она добавляет ещё один шаг при входе в аккаунты, и знания логина с паролем оказывается недостаточно для завладения личными данными.
Почему не стоит использовать СМС
СМС с кодом доступа остаются одним из самых популярных способов двухфакторной аутентификации. Но такой метод наименее надёжен. Злоумышленники умеют подменять номер доставки сообщения, то есть производить переадресацию. К тому же вы можете потерять свой телефон или другое устройство, с которым синхронизирован смартфон. Тогда сообщение с кодом для верификации попадёт не к вам, а к тому, кто завладел девайсом. Телекоммуникационный сектор нередко оказывается подвержен атакам, в ходе которых хакеры перехватывают звонки и СМС.
Чем пользоваться для двухфакторной аутентификации
Установите специальные приложения, которые будут генерировать коды для входа в аккаунты. Такие программы сами защищены паролем, и злоумышленники не смогут получить к ним доступ, даже если завладеют устройством. К тому же коды доступа в приложениях обычно автоматически исчезают после просмотра. И хакеры не смогут перехватить их, как в случае с СМС или звонками. Другими преимуществами являются более высокая скорость получения кодов и независимость от мобильного оператора.
Приложения работают на мобильных устройствах и компьютерах и позволяют синхронизировать аккаунты. Среди наиболее удобных сервисов — менеджер паролей 1Password, Authy. Для тех, кто доверяет только крупным корпорациям, подойдут Google Authenticator и Microsoft Authenticator. Google Prompt работает на базе Google Now в Android и Google Search в iOS, то есть с ним вам даже не потребуется устанавливать отдельное приложение для генерации кодов.
Цена: Бесплатно
Цена: Бесплатно
Цена: Бесплатно
Цена: Бесплатно
Цена: Бесплатно
Разработчик: AuthyЦена: Бесплатно
Цена: Бесплатно
Цена: Бесплатно
Хороших приложений достаточно много — вы обязательно найдёте для себя удобный способ двухфакторной аутентификации. Это лучше, чем СМС и тем более чем только логин и пароль.
lifehacker.ru
Send SMS - BSG - Сервис рассылки СМС №1
Send a message
Creates a new message object. BSG returns the created message object with each request. Per request, a max of 50 phones can be entered.
REQUIRED PARAMETERS
destination | string | The type of message campaign. Required Values can be: phone (single message reuest). phones (multiple message reuest). |
originator | string | The sender of the message. This can be a telephone number (including country code) or an alphanumeric string. In case of an alphanumeric string, the maximum length is 11 characters. Required |
body | string | The body of the SMS message. Required |
msisdn | string | The telephone number. Required |
reference | string | A client reference. Required |
phones | array | The array of recipients msisdn's & reference's. Required Set only for multiple message request ("destination": "phones"). |
OPTIONAL PARAMETERS
validity | int | The amount of seconds that the message is valid. |
tariff | int | Tariff code of a price grid. |
DEFINITION
PUT (POST) https://app.bsg.hk/rest/sms/create
RETURNSReturns a message object if the request was successful. If the request failed, an error object will be returned.
EXAMPLE REQUEST (SINGLE MESSAGE)
{ "destination":"phone", "originator":"alpha name", "body":"message text", "msisdn":"380972000000", "reference":"ext_id_16", "validity":"1", "tariff":"0" }
EXAMPLE RESPONSE (SINGLE MESSAGE)
{ "result":{ "error":0, "errorDescription":"No errors", "reference":"ext_id_16", "id":"213", "price":0.23, "currency":"EUR" } }
EXAMPLE REQUEST (MULTIPLE MESSAGES)
{ "validity":"1", "tariff":"0", "destination":"phones", "originator":"alpha_name", "body":"message text", "phones":[ { "msisdn":"380972000000", "reference":"ext_id_17" }, { "msisdn":"380972000001", "reference":"ext_id_18" } ] }
ATTRIBUTES
task_id | int | An unique random ID which is created for multiple request. |
EXAMPLE RESPONSE (MULTIPLE MESSAGES)
{ "task_id":"6", "result":[ { "error":0, "errorDescription":"No errors", "reference":"ext_id_17", "id":"214", "price":0.23, "currency":"EUR" }, { "error":0, "errorDescription":"No errors", "reference":"ext_id_18", "id":"215", "price":0.23, "currency":"EUR" } ], "total_price":0.46, "currency":"EUR" }
bsg.world