Я пользуюсь двухэтапной аутентификацией на некоторых серверах. Т.е., например, чтобы войти в почту gmail: ввожу логин пароль, а затем ввожу одноразовый пароль, сгенерированный google authenticator. И вот мне подумалось, а что, если я потеряю телефон, на котором стоит этот google authenticator? Я больше не войду в сервисы, для которых он генерирует одноразовый пароль? А если после утери девайса у меня появится срочная необходимость войти в сервисы, защищенные этим TOTP? А если мне просто захочется зайти в эти сервисы, когда телефон будет разряжен и не будет возможности его зарядить, но под рукой будет компьютер?
Когда сервис, защищенный TOTP предлагает сканировать QR-код для Google Authenticator — можно не только сканировать QR-код, но и записать собственно значение ключа. Например, для google mail оно может быть такое:
csnji4rfndisoh323fdsioah3u2iodso |
а для сервиса btc-e такое:
DHSJHDW89E8DFUS98RIO23J390EFU234IR90WEUIF903DMSKAKDS= |
Так вот, в случае, если телефон с установленным Google authenticator потерян (разряжен), можно сгенерировать одноразовый пароль просто на компьютере. В Ubuntu достаточно запустить консоль, в ней запустить python, а в python определить функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | def totpgen (): import time import hmac import hashlib import base64 ### TOTP-key for Google #secret = base64.b32decode("csnji4rfndisoh323fdsioah3u2iodso", True) #totp for btc-e #secret = base64.b32decode("DHSJHDW89E8DFUS98RIO23J390EFU234IR90WEUIF903DMSKAKDS====") ### Calc counter from UNIX time (see RFC6238) counter = long(time.time() / 30) ### Use counter as 8 byte array bytes=bytearray() for i in reversed(range(0, 8)): bytes.insert(0, counter & 0xff) counter >>= 8 ### Calculate HMAC-SHA1(secret, counter) hs = bytearray(hmac.new(secret, bytes, hashlib.sha1).digest()) ### Truncate result (see RFC4226) n = hs[-1] & 0xF result = (hs[n] << 24 | hs[n+1] << 16 | hs[n+2] << 8 | hs[n+3]) & 0x7fffffff ### Print last 6 digits return str(result)[-6:] |
Для генерирования одноразового пароля Google mail вставить в качестве аргумента для функции base64.b32decode ключ, полученный от Google, и раскомментировать строку:
8 | secret = base64.b32decode("csnji4rfndisoh323fdsioah3u2iodso", True) |
Для генерирования одноразового пароля btc-e вставить в качестве аргумента для функции base64.b32decode ключ, полученный от btc-e, дописать в конце его «===» и раскомментировать строку:
10 | secret = base64.b32decode("DHSJHDW89E8DFUS98RIO23J390EFU234IR90WEUIF903DMSKAKDS====") |
После этого вызвать из той же консоли эту функцию:
1 2 | totpgen () 123456 |
И всех делов)
Для Windows все примерно также, только среду python нужно скачать.
Что такое Одноразовый пароль.
Далее, очень подробно и с примером, как работает одноразовый пароль.
Как работает TOTP, wiki.
— есть стандарт для реализации
— доступны реализации с открытым кодом (для реализации технологии, но не для встраивания в работающие системы, которые не поддерживают эту технологию)
— большое (и все увеличивающееся) количество систем, поддерживающих эту технологию (названия поддерживающих систем говорят сами за себя)
— проверенная и доказанная надежность
— отсутствие дополнительных точек отказа при доставке сообщений, присущих доставке пароля, например с помощью SMS
— отсутствие накладных расходов, присущих доставке пароля, например с помощью SMS
— отсутствие необходимости доверять данные сторонним системам