Код Senior Аутентификация и сессии обновлено
TOTP по RFC 6238
Условие
Реализуйте totp(secret, t, digits): одноразовый код по RFC 6238 с HMAC-SHA1 и шагом 30 секунд.
secretстрока, её байты в UTF-8 это ключ HMAC.- Счётчик
T = t // 30, 8 байт big-endian. h = HMAC-SHA1(ключ, счётчик).- Динамическое усечение:
offset = h[19] & 0x0f, взять 4 байта сoffset, старший бит обнулить (& 0x7fffffff). - Код это число по модулю
10 ** digits, дополненное ведущими нулями доdigitsсимволов.
Верните строку.
Примеры
totp("12345678901234567890", 59, 8) // "94287082"
totp("12345678901234567890", 1111111109, 8) // "07081804"
totp("12345678901234567890", 1111111111, 8) // "14050471"
Как подойти
Подсказки: 2
struct.pack(">Q", t // 30)даёт 8-байтовый счётчик.- Не забудьте
zfill, иначе потеряете ведущие нули.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.