воскресенье, 15 января 2012 г.

Зная про тулзу для двухфакторной аутентификации в гугле с использованием yubikey, решил реализовать аналогичную вещь и в linux. Удобства ради решил использовать python-yubico, предоставляющую нормальный интерфейс. И увидел прелестный пакет python-yubico-tools, в котором и была найдена утилита yubikey-totp. Неприятной неожиданностью стало то, что код, возвращаемый этой утилитой не соответствовал тому, что возвращал google-authenticator или моя прога на python'e, реализующая totp из rfc6238. Основное, что следует помнить про g-a, что он хранит ключ в base32, а большинство библиотек хотят шестнадцатеричное представление. Но это не вызывает проблем. Опасаясь, что косяк мой -- с загрузкой ключа в yubikey (нужен в обычном шестнадцатеричном виде с паддингом нулями), проверил на ключе из вышеупомянутого rfc. И увидел, что всё нормально. С другой стороны yubikey-totp с параметром --time давал тот же результат, что и написан в стандарте. Меня озадачило это поведение. Как выяснилось при дебагге, эти товарищи умудрились использовать
int(time.mktime(time.gmtime()))
что при tz отличной от +0000 давало не время от начало Эпохи, а его же с поправкой на временную зону. Т. е. на компе с tz MSK (+0400) это число было на 4 * 3600 меньше текущего unix-time. Почему эти странные "товарищи" не воспользовались куда более очевидным
int(time.time())
мне не ведомо. Написал в соответствующую гуглогруппу, посмотрим.