ฉันพยายามที่จะใช้รหัสผ่านครั้งเดียวที่สามารถสร้างขึ้นโดยใช้แอพลิเคชัน 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
ค่า (10,000 แรกเริ่มต้นด้วยintervals_no = 0
) โดยsecret
ให้เท่ากับคีย์ที่ให้ไว้ในแอป GA
คำถามที่ฉันมี
คำถามของฉันคือ:
- ผมทำอะไรผิดหรือเปล่า?
- ฉันจะสร้าง HOTP และ / หรือ TOTP ใน Python ได้อย่างไร
- มีไลบรารี Python สำหรับสิ่งนี้หรือไม่?
สรุป: โปรดแจ้งเบาะแสที่จะช่วยให้ฉันใช้การตรวจสอบสิทธิ์ Google Authenticator ภายในรหัส Python ของฉัน