Tôi đang cố gắng sử dụng mật khẩu dùng một lần có thể được tạo bằng ứng dụng Google Authenticator .
Google Authenticator làm gì
Về cơ bản, Google Authenticator triển khai hai loại mật khẩu:
- HOTP - Mật khẩu dùng một lần dựa trên HMAC, có nghĩa là mật khẩu được thay đổi với mỗi cuộc gọi, tuân theo RFC4226 và
- TOTP - Mật khẩu dùng một lần dựa trên thời gian, thay đổi trong khoảng thời gian 30 giây một lần (theo tôi biết).
Google Authenticator cũng có sẵn dưới dạng Nguồn mở tại đây: code.google.com/p/google-authenticator
Mã hiện tại
Tôi đã tìm kiếm các giải pháp hiện có để tạo mật khẩu HOTP và TOTP, nhưng không tìm thấy nhiều. Mã tôi có là đoạn mã sau chịu trách nhiệm tạo 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
Vấn đề tôi đang gặp phải là mật khẩu tôi tạo bằng mã trên không giống với mật khẩu được tạo bằng ứng dụng Google Authenticator dành cho Android. Mặc dù tôi đã thử nhiều intervals_no
giá trị (chính xác là 10000 đầu tiên, bắt đầu bằng intervals_no = 0
), secret
bằng với khóa được cung cấp trong ứng dụng GA.
Câu hỏi tôi có
Câu hỏi của tôi là:
- Tôi đang làm gì sai?
- Làm cách nào để tạo HOTP và / hoặc TOTP bằng Python?
- Có thư viện Python nào hiện có cho việc này không?
Tóm lại: vui lòng cung cấp cho tôi bất kỳ manh mối nào sẽ giúp tôi triển khai xác thực Google Authenticator trong mã Python của tôi.