Предисловие
С ростом числа угроз кибербезопасности, для разработчиков становится все более и более необходимым обновлять стандарты безопасности веб-приложений и быть при этом уверенными в том, что аккаунты пользователей в безопасности. Для этого в настоящее время многие онлайн-приложения просят пользователей добавить дополнительный уровень безопасности для своей учетной записи. Они делают это за счет включения двухфакторной аутентификации. Существуют различные методы реализации двухфакторной аутентификации, но, прежде всего, необходимо выяснить, что именно она из себя представляет .1. Двухфакторная аутентификация
Напомню, что двухфакторная аутентификация (или многофакторная аутентификация) — это метод идентификации пользователя в каком-либо сервисе (как правило, в Интернете) при помощи запроса аутентификационных данных двух разных типов, что обеспечивает двухслойную, а значит, более эффективную защиту аккаунта от несанкционированного проникновения. Это означает, что после включения двухфакторной аутентификации пользователь должен пройти еще один шаг для успешного входа в систему. Стандартные шаги для входа в учетную запись – это ввод логина и ввод пароля (Рис.1)Рис1. Порядок входа в учетную запись без двухфакторной аутентификации
Включение двухфакторной аутентификации добавляет в порядок входа дополнительный шаг (Рис.2)
Рис2. Вход в учетную запись с подключенной двухфакторной аутентификацией
В настоящее время существует два широко используемых метода получения одноразового пароля:
- На основе SMS. Каждый раз, когда пользователь входит в систему, он получает на указанный в учетной записи номер мобильного телефона текстовое сообщение, которое содержит одноразовый пароль.
- На основе TOTP. При включении двухфакторной аутентификации пользователю предлагается отсканировать QR-код с помощью специального приложения для смартфона, которое в дальнейшем постоянно генерирует одноразовый пароль для пользователя.
Метод на основе SMS , несмотря на свою простоту, имеет ряд проблем. Например, ожидание SMS при каждой попытке входа в систему, проблемы с безопасностью и т. д. Вследствие чего NIST еще в 2016 году рекомендовала не использовать его в новых системах аутентификации. В связи с минусами метода на основе SMS, метод на основе TOTP становится популярным из-за его преимуществ.
//создание секретного ключа длиной в 20Байт
secretKey = generateSecretKey(20);
//сохраняем данный ключ в базе данных для этого пользователя
saveUserSecretKey(userId, secrenKey);
//конвертируем секретный ключ в QR код
qr = convertToQrCode(secretKey);
//отправляем QR изображение в качестве ответа
response(qr)
Пользователя просят отсканировать этот QR-код. Когда приложение его сканирует, оно получит секретный ключ. Используя этот секретный ключ, текущее время Unix и алгоритм HOTP, мобильное приложение сгенерирует и отобразит пароль. Затем система просит пользователя ввести сгенерированный код после сканирования QR-кода. Это необходимо, чтобы убедиться, что пользователь успешно отсканировал изображение и приложение для телефона успешно сгенерировало код.
//получение секретного ключа из базы данных
secretKey = getSecretKeyOfUser(userId);
//проверка введенного кода
if (codeTypedByUser === getHOTP(secretKey, currentUnixTime)) {
signIn(userId);
}
2. Метод на основе TOTP
Для реализации двухфакторной аутентификации с использованием TOTP необходимо учитывать основное требование – пароль должен создаваться на стороне пользователя, а также постоянно меняться. Для генерации одноразового пароля нам понадобится алгоритм HOTP.3. Алгоритм HOTP
HOTP переводится как «Одноразовый пароль на основе HMAC». Этот алгоритм был опубликован инженерной группой Интернета (IETF) как RFC4226. HOTP определяет алгоритм создания одноразового пароля из секретного ключа и счетчика. Этот алгоритм включает в себя два этапа:- Первый шаг - создать хэш HMAC из секретного ключа и счетчика.
- В итоге на выходе мы получим строку длиной 20 Байт. Эта длинная строка не подходит в качестве одноразового пароля. Алгоритм HOTP определяет способ обрезать эту строку до желаемой длины.
4. Использование QR-кода
Поскольку большинство смартфонов оснащено камерой, можно её использовать и попросить пользователя отсканировать QR-код, чтобы получить от него секретный ключ. Итак, все, что нужно сделать, это преобразовать секретный ключ в QR-код и показать его пользователю.5.Реализация TOTP
В настоящее время есть несколько бесплатных мобильных приложений (например, Google Authenticator App, Authy и т.д.), которые могут генерировать одноразовый пароль для пользователя. Поэтому в большинстве случаев создавать собственное телефонное приложение не нужно. Следующий псевдокод представлен в качестве объяснения способа реализации двухфакторной аутентификации на основе TOTP в веб-приложении://создание секретного ключа длиной в 20Байт
secretKey = generateSecretKey(20);
//сохраняем данный ключ в базе данных для этого пользователя
saveUserSecretKey(userId, secrenKey);
//конвертируем секретный ключ в QR код
qr = convertToQrCode(secretKey);
//отправляем QR изображение в качестве ответа
response(qr)
Пользователя просят отсканировать этот QR-код. Когда приложение его сканирует, оно получит секретный ключ. Используя этот секретный ключ, текущее время Unix и алгоритм HOTP, мобильное приложение сгенерирует и отобразит пароль. Затем система просит пользователя ввести сгенерированный код после сканирования QR-кода. Это необходимо, чтобы убедиться, что пользователь успешно отсканировал изображение и приложение для телефона успешно сгенерировало код.
//получение секретного ключа из базы данных
secretKey = getSecretKeyOfUser(userId);
//проверка введенного кода
if (codeTypedByUser === getHOTP(secretKey, currentUnixTime)) {
signIn(userId);
}