Код Senior Аутентификация и сессии обновлено

TOTP по RFC 6238

Условие

Реализуйте totp(secret, t, digits): одноразовый код по RFC 6238 с HMAC-SHA1 и шагом 30 секунд.

  1. secret строка, её байты в UTF-8 это ключ HMAC.
  2. Счётчик T = t // 30, 8 байт big-endian.
  3. h = HMAC-SHA1(ключ, счётчик).
  4. Динамическое усечение: offset = h[19] & 0x0f, взять 4 байта с offset, старший бит обнулить (& 0x7fffffff).
  5. Код это число по модулю 10 ** digits, дополненное ведущими нулями до digits символов.

Верните строку.

Примеры

totp("12345678901234567890", 59, 8) // "94287082"
totp("12345678901234567890", 1111111109, 8) // "07081804"
totp("12345678901234567890", 1111111111, 8) // "14050471"

Как подойти

Подсказки: 2
  1. struct.pack(">Q", t // 30) даёт 8-байтовый счётчик.
  2. Не забудьте zfill, иначе потеряете ведущие нули.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.