Estou tentando usar senhas de uso único que podem ser geradas usando o aplicativo Google Authenticator .
O que o Google Authenticator faz
Basicamente, o Google Authenticator implementa dois tipos de senhas:
- HOTP - Senha de uso único baseada em HMAC, o que significa que a senha é alterada a cada chamada, em conformidade com RFC4226 , e
- TOTP - Senha de uso único baseada em tempo, que muda a cada período de 30 segundos (até onde eu sei).
O Google Authenticator também está disponível como código aberto aqui: code.google.com/p/google-authenticator
Código atual
Eu estava procurando soluções existentes para gerar senhas HOTP e TOTP, mas não encontrei muito. O código que tenho é o seguinte snippet responsável por gerar 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
O problema que estou enfrentando é que a senha que gero usando o código acima não é a mesma que gerada usando o aplicativo Google Authenticator para Android. Embora eu tenha tentado vários intervals_no
valores (exatamente os primeiros 10000, começando com intervals_no = 0
), secret
sendo igual à chave fornecida no aplicativo GA.
Perguntas que tenho
Minhas perguntas são:
- O que estou fazendo de errado?
- Como posso gerar HOTP e / ou TOTP em Python?
- Existe alguma biblioteca Python existente para isso?
Resumindo: dê-me alguma pista que me ajude a implementar a autenticação do Google Authenticator no meu código Python.