Google Authenticator implementation in Python

G8bao7發表於2017-09-29



點選(此處)摺疊或開啟

  1. #!/usr/bin/env python
  2. # coding= utf-8
  3. '''
  4. Created on 2017年9月29日

  5. @author: babaoqi
  6. '''
  7. import string, random
  8. import hmac, base64, struct, hashlib, time


  9. def random_str(size=10):
  10.     #all_char = string.letters + string.digits + string.punctuation
  11.     all_char = string.letters + string.digits
  12.     rchars = [random.choice(all_char) for i in range(size)]
  13.     rstr = "".join(rchars)
  14.     return rstr
  15.     
  16. def get_secret():
  17.     rstr = random_str()
  18.     # random_str 長度必須是5的倍數, encode後最後才不含'='
  19.     # 長度=10,encode返回長度為16
  20.     secret = base64.b32encode(rstr)
  21.     return secret.upper()

  22. # 基於次數
  23. def get_hotp_token(secret, intervals_no):
  24.     key = base64.b32decode(secret, True)
  25.     msg = struct.pack(">Q", intervals_no)
  26.     googleCode = hmac.new(key, msg, hashlib.sha1).digest()
  27.     o = ord(googleCode[19]) & 15
  28.     googleCode = (struct.unpack(">I", googleCode[o:o + 4])[0] & 0x7fffffff) % 1000000
  29.     # 如果驗證碼的第一位是0,則不會顯示。此處判斷若是5位碼,則在第一位補上0
  30.     # 前面補0
  31.     sl = len(str(googleCode))
  32.     if sl < 6:
  33.         googleCode = "%s%s" % ('0' * (6 - sl), googleCode)
  34.     return googleCode

  35. # 基於時間
  36. def get_totp_token(secret):
  37.     period_seconds = 30
  38.     intervals_no = int(time.time()) // period_seconds
  39.     return get_hotp_token(secret, intervals_no)

  40. if __name__ == '__main__':
  41.     secret = get_secret()
  42.     
  43.     for i in xrange(0,30):
  44.         print secret, get_totp_token(secret), get_hotp_token(secret, i)
  45.         time.sleep(4)
  46.     
  47.     exit(0)

  1.     # random_str 長度必須是5的倍數, encode後最後才不含'='

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-2145604/,如需轉載,請註明出處,否則將追究法律責任。

相關文章