Saya mencoba menggunakan sandi sekali pakai yang dapat dibuat menggunakan aplikasi Google Authenticator .
Apa yang dilakukan Google Authenticator
Pada dasarnya, Google Authenticator menerapkan dua jenis kata sandi:
- HOTP - Kata Sandi Satu Kali Berbasis HMAC, yang berarti kata sandi diubah dengan setiap panggilan, sesuai dengan RFC4226 , dan
- TOTP - Kata Sandi Satu Kali Berbasis Waktu, yang berubah untuk setiap periode 30 detik (sejauh yang saya tahu).
Google Authenticator juga tersedia sebagai Open Source di sini: code.google.com/p/google-authenticator
Kode saat ini
Saya sedang mencari solusi yang ada untuk menghasilkan kata sandi HOTP dan TOTP, tetapi tidak menemukan banyak. Kode yang saya miliki adalah potongan berikut yang bertanggung jawab untuk menghasilkan 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
Masalah yang saya hadapi adalah bahwa kata sandi yang saya buat menggunakan kode di atas tidak sama dengan yang dibuat menggunakan aplikasi Google Authenticator untuk Android. Meskipun saya mencoba beberapa intervals_no
nilai (tepatnya pertama 10000, dimulai dengan intervals_no = 0
), dengan secret
sama dengan kunci yang disediakan dalam aplikasi GA.
Pertanyaan yang saya miliki
Pertanyaan saya adalah:
- Apa yang saya lakukan salah?
- Bagaimana cara membuat HOTP dan / atau TOTP dengan Python?
- Apakah ada pustaka Python yang ada untuk ini?
Singkatnya: tolong beri saya petunjuk apa pun yang akan membantu saya menerapkan otentikasi Google Authenticator dalam kode Python saya.