2fa от 979, с отображением одноразовых паролей, действительных в течение определенного времени

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

Стандартизован как RFC 6238.

История

править

С 2004 года OATH работала над проектом одноразовых паролей (OTP). Первым результатом был HOTP (the Hash-based Message Authentication Code (HMAC) OTP algorithm), опубликованный в декабре 2005 года. Он был представлен как проект IETF (The Internet Engineering Task Force)[2][3].

Дальнейшая работа OATH шла на улучшение HOTP и в 2008 году был представлен TOTP[4]. Этот алгоритм не использует счётчик для синхронизации клиента и сервера, а генерирует пароль в зависимости от времени, который действителен в течение некоторого интервала. Алгоритм действует так: клиент берёт текущее значение таймера и секретный ключ, хеширует их с помощью какой-либо хеш-функции и отправляет серверу, в свою очередь сервер проводит те же вычисления после чего ему остаётся только сравнить эти значения[5]. Он может быть реализован не только на хеш-функции SHA-1, в отличие от HOTP, поэтому хеш-функция также является входным параметром[2].

Позднее был представлен новый алгоритм, расширяющий TOTP ещё больше. Он был представлен в сентябре 2010 года и назван OATH Challenge-Response Algorithms (OCRA). Главное отличие от предыдущих алгоритмов заключается в том, что в проверке подлинности участвует и сервер. Так что клиент может быть также уверен в его подлинности[2].

Принцип работы

править

TOTP является вариантом алгоритма HOTP, в котором в качестве значения счётчика подставляется величина, зависящая от времени[1]. Обозначим:

  •  — дискретное значение времени, используемое в качестве параметра (измеряется в единицах , 8 байтов)
  •  — интервал времени, в течение которого действителен пароль (по умолчанию — 30 сек.)
  •  — начальное время, необходимое для синхронизации сторон (по умолчанию — время от начала UNIX-эры)
  •  — разделяемый секрет
  •  — текущее время.

Тогда[1][6]

где

  • HMAC-SHA-1(K,T) — генерация 20 байт на основе секретного ключа и времени с помощью хеш-функции SHA-1.
  • Truncate — функция выбора определённым способом 4 байт:

обозначим String — результат HMAC-SHA-1(K,T); OffsetBits — младшие 4 бита строки String; Offset = StringToNumber(OffsetBits) и результатом Truncate будет строка из четырёх символов — String[Offset]String[Offset + 3][6].

В отличие от HOTP, который основан только на SHA-1, TOTP может также использовать HMAC-SHA-256, HMAC-SHA-512 и другие HMAC-хеш-функции:

и так далее[1].

Надёжность алгоритма

править

Концепция одноразовых паролей вкупе с современными криптографическими методами может использоваться для реализации надёжных систем удалённой аутентификации[5]. TOTP достаточно устойчив к криптографическим атакам, однако вероятности взлома есть, например возможен такой вариант атаки «человек посередине»:

Прослушивая трафик клиента, злоумышленник может перехватить посланный логин и одноразовый пароль (или хеш от него). Затем ему достаточно блокировать компьютер «жертвы» и отправить аутентификационные данные от собственного имени. Если он успеет это сделать за промежуток времени , то ему удастся получить доступ. Именно поэтому стоит делать небольшим. Но если время действия пароля сделать слишком маленьким, то в случае небольшой рассинхронизации клиент не сможет получить доступ[5].

Также существует уязвимость, связанная с синхронизацией таймеров сервера и клиента, так как существует риск рассинхронизации информации о времени на сервере и в программном и/или аппаратном обеспечении пользователя. Поскольку TOTP использует в качестве параметра время, то при несовпадении значений все попытки пользователя на аутентификацию завершатся неудачей. В этом случае ложный допуск чужого также будет невозможен. Стоит отметить, что вероятность такой ситуации крайне мала[5].

Примечания

править

Литература

править

Ссылки

править

📚 Artikel Terkait di Wikipedia

C++26

как string_view. Заявленная цель: роль обычного string’а сжалась до объекта промежуточного хранения, и часть функций string’а уже принимают string_view

C++23

operator() (std::string_view a, std::string_view b) // было const, стало static { return someCustomLess(a, b); } }; std::set<std::string, CustomCompare>

Массив (тип данных)

строк. Нумерация по типу word (от 0 до 65536)} rangeArray : array [Word] of String; Пример фиксированного массива на Си int Array[10]; // Одномерный массив:

Временная сложность алгоритма

лексикографически больше, чем ω {\displaystyle \omega } . int find(vector<string> &D, string w) { int n = D.size(); int l = -1, r = n; while(r - l > 1) { int m

Поиск длиннейшей подстроки-палиндрома

либо первый символ строки #include <string> #include <vector> using namespace std; string longestPalindrome(const string &s){ vector<char> s2(s.size() * 2

Алгоритм Кнута — Морриса — Пратта

Christian Charras, Knuth-Morris-Pratt algorithm // Цикл лекций Exact String Matching Algorithms, Université de Rouen, 1997 В другом языковом разделе есть более

Кортеж (информатика)

упаковки в кортеж: fn div_with_remainder(a: i32, b: i32) -> (i32, i32, String) { let tmp = (a/b, a%b); (tmp.0, tmp.1, format!("{} + {}", tmp.0, tmp.1))

Алгоритм Бойера — Мура

Архивная копия от 16 декабря 2008 на Wayback Machine (англ.) Exact string matching algorithms — Introduction Архивная копия от 16 декабря 2008 на Wayback Machine (англ