Как работают одноразовые пароли на основе времени и почему их следует использовать в своей программе?

1656595097 kak rabotayut odnorazovye paroli na osnove vremeni i pochemu ih

Прокаш Шарма

to2RJdfr-4QWV8Iil0IIGYukHu0tYSZGuqDm
Фото Уильяма Айвена на Unsplash

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

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

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

Что такое двухфакторная аутентификация?

Двухфакторная аутентификация (или многофакторная аутентификация) – это только дополнительный уровень безопасности для учетной записи пользователя. Это означает, что после включения двухфакторной проверки подлинности пользователь должен пройти еще один шаг для успешного входа. Например, обычные шаги для входа в аккаунт:

ZqTllcloHTWpzWYDh-YsnOggoitxJSicGiVj

Но после включения 2-факторной аутентификации шаги выглядят примерно так:

inJY5oemUFqSO2g5G6HvPpNt0I74XF0hlRKV

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

На данный момент существует два широко используемых метода получения одноразового пароля:

  1. на основе SMS: В этом методе каждый раз, когда пользователь входит в систему, он получает текстовое сообщение на свой номер телефона, которое содержит одноразовый пароль.
  2. На основе TOTP: В этом методе, включив 2-факторную аутентификацию, пользователю предлагается отсканировать QR-изображение с помощью программы для смартфона.
    Затем это приложение постоянно генерирует одноразовый пароль для пользователя.

Метод на основе SMS не требует пояснения. Это легко, но у него есть свои проблемы, такие как ожидание SMS при каждой попытке входа, проблемы с безопасностью и т.д. Метод на основе TOTP становится популярным из-за его преимуществ перед методом на основе SMS. Итак, давайте разберемся, как работает способ на базе TOTP.

Как работает метод на основе TOTP

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

Используя метод TOTP мы создаем одноразовый пароль на стороне пользователя (а не на стороне сервера) через приложение для смартфона.

Это означает, что пользователи всегда имеют доступ к своему одноразовому паролю. Таким образом, он не позволяет серверу отправлять текстовое сообщение всякий раз, когда пользователь пытается войти.

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

Прекрасно! Теперь давайте разберемся в работе TOTP-метода и попытаемся реализовать вышеприведенное решение самостоятельно. Наше требование здесь создать пароль на стороне пользователя, и этот пароль должен постоянно меняться.

Следующее может быть способом реализации этого решения:

When the user enables two factor authentication:
1. Backend server creates a secret key for that particular user.2. Server then shares that secret key with the user’s phone application.3. Phone application initializes a counter.4. Phone application generate a one time password using that secret key and counter.5. Phone application changes the counter after a certain interval and regenerates the one time password making it dynamic.

Это должно работать, но с этим есть три основные проблемы:

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

Решение первой задачи определено в алгоритме HOTP.

Понимание HOTP:

HOTP означает «одноразовый пароль на основе HMAC». Этот алгоритм был опубликован как RFC4226 Internet Engineering Task Force (IETF). HOTP определяет алгоритм создания одноразового пароля из секретного ключа и счетчика.

Вы можете использовать этот алгоритм в два шага:

  1. Первый шаг – создать хеш HMAC из секретного ключа и счетчика.
// Obtain HMAC hash (using SHA-1 hashing algorithm) by secretKey and counter
hmacHash = HMAC-SHA-1(secretKey, counter);

2. В этом коде исходной будет строчка длиной 20 байт. Эта длинная строка не подходит как одноразовый пароль. Следовательно, нам нужен способ обрезать эту строчку. HOTP определяет способ обрезать эту строчку до желаемой длины.

// hmacHash[19] means 19th byte of the string.offset = hmacHash[19] & 0xf;
truncatedHash = (hmacHash[offset++] & 0x7f) << 24 | (hmacHash[offset++] & 0xff) << 16 | (hmacHash[offset++] & 0xff) << 8 | (hmacHashh[offset++] & 0xff);
finalOTP = (truncatedHash % (10 ^ numberOfDigitsRequiredInOTP));

Это может выглядеть страшно, но это не так. В этом алгоритме сначала получаем offset что являются последними 4 битами hmacHash[19]. После этого мы объединяем байты с hmacHash[offset] к hmacHash[offset+3] и сохранять последние 31 бит в truncatedHash. Наконец, используя простую операцию по модулю, мы получаем одноразовый пароль разумной длины.

Это в значительной степени определяет алгоритм HOTP. Документ RFA4226 объясняет, почему это самый безопасный способ получить одноразовый пароль из этих двух значений.

Прекрасно! Итак, мы нашли способ получить одноразовый пароль с помощью секретного ключа и счетчика. Но как насчет второй проблемы? Как следить за счетчиком?

Решение второй проблемы найдено в TOTP.

Понимание TOTP:

TOTP означает «одноразовый пароль на основе времени». Это было опубликовано IETF как RFC6238.

TOTP использует алгоритм HOTP для получения одноразового пароля. Единственное отличие состоит в том, что оно использует «Время» вместо «счетчика», и это дает решение нашей второй проблемы.

Это означает, что вместо инициализации счетчика и отслеживания его, мы можем использовать время в качестве счетчика в алгоритме HOTP для получения одноразового пароля. Поскольку сервер и телефон имеют доступ ко времени, ни один из них не должен следить за счетчиком.

Кроме того, чтобы избежать проблемы с разными часовыми поясами сервера и телефона, мы можем использовать метку времени Unix, которая не зависит от часовых поясов.

Однако время Unix определяется в секундах, поэтому меняется ежесекундно. Это означает, что сгенерированный пароль будет изменяться ежесекундно, что плохо. Вместо этого нам нужно добавить значительный интервал перед сменой пароля. Например, Google Authenticator изменяет код каждые 30 секунд.

counter = currentUnixTime / 30

Итак, мы решили проблему счетчика. Теперь нам нужно решить нашу третью проблему: обмен секретным ключом с телефонной программой. Здесь нам может помочь QR-код.

Использование QR-кода

Хотя мы можем попросить пользователей ввести секретный ключ непосредственно в приложение для телефона, мы хотим сделать секретные ключи достаточно длинными из соображений безопасности. Попросить пользователя ввести такую ​​длинную строку не будет удобным для пользователя.

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

Мы решили все три проблемы! И теперь вы знаете, как работает TOTP. Давайте посмотрим, как это реализовать в приложении.

Как реализовать TOTP

Есть несколько бесплатных приложений для телефона (например, Google Authenticator App, Authy и т.д.), которые могут генерировать одноразовый пароль пользователя. Поэтому в большинстве случаев создавать собственное приложение для телефона не нужно.

Следующие псевдокоды объясняют способ реализации 2-факторной аутентификации на основе TOTP в веб-приложении.

When user request to enable 2-factor authentication
// Generate a secret key of length 20.secretKey = generateSecretKey(20);
// Save that secret key in database for this particular user.saveUserSecretKey(userId, secretKey);
// convert that secret key into qr image.qrCode = convertToQrCode(secretKey);
// send the qr image as responseresponse(qrCode);

Пользователя просят сканировать этот QR-код. Когда приложение телефона сканирует QR-код, он получает секретный пользовательский ключ. Используя этот секретный ключ, текущее время Unix и алгоритм HOTP, приложение телефона сгенерирует и отобразит пароль.

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

User types the code displayed in the application.
// Fetch secret key from database.secretKey = getSecretKeyOfUser(userId);
if (codeTypedByUser == getHOTP(secretKey, currentUnixTime / 30)) {   enableTwoFactorAuthentication(userId);}

Здесь мы используем алгоритм HOTP на стороне сервера, чтобы получить аутентификацию на основе OTP по секретному ключу и текущему времени Unix. Если этот одноразовый пароль совпадает с введенным пользователем, мы можем включить 2-факторную аутентификацию для этого пользователя.

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

User types the code displayed in the phone application to login
// Fetch secret key from database.secretKey = getSecretKeyOfUser(userId);
if (codeTypedByUser == getHOTP(secretKey, currentUnixTime)) {   signIn(userId);}

Что произойдет, если пользователь потеряет код?

Есть несколько способов помочь пользователю восстановить код. Обычно, когда они включают 2-факторную аутентификацию, мы можем показать им секретный ключ вместе с QR-кодом и попросить их сохранить этот код где-нибудь безопасно.

Такие приложения, как Google Authenticator App, позволяют сгенерировать пароль, непосредственно введя секретный ключ. Если пользователь потеряет код, он может ввести этот надежно сохраненный секретный ключ в приложение телефона, чтобы снова создать одноразовый пароль.

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

Подведению

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

В отличие от метода на основе SMS, метод TOTP также не требует особого труда. Так что эту функцию следует реализовать для любой программы.

Добавить комментарий

Ваш адрес email не будет опубликован.