Google Authenticator アプリケーションを使用して生成できるワンタイム パスワードを使用しようとしています。
Google 認証システムの機能
基本的に、Google Authenticator は 2 種類のパスワードを実装しています。
- 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
私が直面している問題は、上記のコードを使用して生成したパスワードが、Android 用の Google Authenticator アプリを使用して生成したものと同じではないことです。GAアプリ内で提供されたキーと等しい複数のintervals_no
値(正確に最初の10000、で始まるintervals_no = 0
)を試しましたが。secret
私が持っている質問
私の質問は次のとおりです。
- 私は何を間違っていますか?
- Python で HOTP や TOTP を生成するにはどうすればよいですか?
- このための既存の Python ライブラリはありますか?
要約すると、Python コード内に Google Authenticator 認証を実装するのに役立つ手がかりがあれば教えてください。