Я пытаюсь использовать одноразовые пароли, которые могут быть сгенерированы с помощью приложения Google Authenticator.
Что делает Google Authenticator
В основном, Google Authenticator реализует два типа паролей:
- HOTP - одноразовый пароль на основе HMAC, что означает, что пароль изменяется при каждом вызове в соответствии с RFC4226 и
- TOTP - одноразовый пароль, основанный на времени, который изменяется на каждые 30 секунд (насколько мне известно).
Google Authenticator также доступен здесь с открытым исходным кодом: code.google.com/p/google-authenticator
Текущий код
Я искал существующие решения для генерации паролей HOTP и TOTP, но не нашел многого. Код, который у меня есть, следующий фрагмент, ответственный за создание HOTP:
import hmac, base64, struct, hashlib, time
def get_token(secret, digest_mode=hashlib.sha1, intervals_no=None):
if intervals_no == None:
intervals_no = int(time.time()) // 30
key = base64.b32decode(secret)
msg = struct.pack(">Q", intervals_no)
h = hmac.new(key, msg, digest_mode).digest()
o = ord(h[19]) & 15
h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
return h
Проблема, с которой я сталкиваюсь, заключается в том, что пароль, который я генерирую с использованием вышеуказанного кода, не совпадает с созданным с помощью приложения Google Authenticator для Android. Даже если я попробовал несколько значений intervals_no
(ровно сначала 10000, начиная с intervals_no = 0
), при этом secret
был равен ключу, предоставленному в приложении GA.
Вопросы, которые у меня есть
Мои вопросы:
- Что я делаю неправильно?
- Как я могу генерировать HOTP и/или TOTP в Python?
- Существуют ли для этого существующие библиотеки Python?
Подводя итог: дайте мне какие-либо подсказки, которые помогут мне внедрить аутентификацию Google Authenticator в моем коде Python.