Код Senior Криптография на практике и JWT обновлено

Разбор и проверка JWT без библиотек

Условие

Напишите verify_jwt(token, secret, now), которая проверяет JWT, подписанный HS256, и возвращает payload (словарь) или None.

  1. Токен из трёх частей через точку, каждая в base64url без выравнивания =.
  2. Заголовок JSON; alg должен быть строго "HS256". Любой другой алгоритм, включая none и hs256, отклоняется.
  3. Подпись: HMAC-SHA256 от строки заголовок.payload (как в токене) с ключом secret в UTF-8. Сравнение за постоянное время.
  4. Payload JSON-объект. Если есть exp и now >= exp, отклонить. Если есть nbf и now < nbf, отклонить.
  5. Любая ошибка разбора даёт None.

Примеры

verify_jwt("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsImV4cCI6MjAwMH0.CMb9vzJ7E0_rhfASGsnzzkx1LntG0WI7xAyUl6IJw5U", "k3y-for-tests-only-7f2c", 1000) // {"sub":"42","exp":2000}
verify_jwt("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0MiIsImV4cCI6MjAwMH0.CMb9vzJ7E0_rhfASGsnzzkx1LntG0WI7xAyUl6IJw5U", "k3y-for-tests-only-7f2c", 2000) // null
verify_jwt("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI3Iiwicm9sZSI6InVzZXIifQ.-65v9INTrERxjLZG1j-cFx9ztNjWoSC_BiCJbHl27a4", "k3y-for-tests-only-7f2c", 1000000000) // {"sub":"7","role":"user"}

Как подойти

Подсказки: 3
  1. Восстановите выравнивание: s + "=" * (-len(s) % 4).
  2. Сначала проверьте alg, потом подпись, потом сроки.
  3. Оберните разбор в try/except.

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

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