Я пытается использовать одноразовые пароли, которые можно сгенерировать с помощью приложения Google Authenticator .
По сути, Google Authenticator реализует два типа паролей:
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. Несмотря на то, что я пробовал несколько значений interval_no
(ровно первые 10000, начиная с interval_no = 0
), при этом secret
равен ключу, предоставленному в приложении GA.
Мои вопросы:
Подводя итог: дайте мне какие-либо подсказки, которые помогут мне реализовать аутентификацию Google Authenticator в моем коде Python.