SORU
16 Aralık 2011, Cuma


Google Doğrulayıcı uygulama Python

Bir kez oluşturulan şifreleri Google Authenticator application kullanarak kullanmaya çalışıyorum.

Doğrulayıcı Google ne yapıyor

Temelde, Google Doğrulayıcı şifre: iki tür uygular

  • HOTPŞifre RFC4226, uyum içinde her arama ile değiştirilir anlamına gelir. - tabanlı HMAC Tek kullanımlık Şifre,
  • TOTP- Tabanlı süresi 30 saniye, her dönem için değişen Tek seferlik Parola (bildiğim kadarıyla).

Google Kanıtlayıcı de Açık olarak kullanılabilir Kaynak burada: code.google.com/p/google-authenticator

Geçerli kod

Mevcut çözümler için HOTP ve TOTP şifreler oluşturmak için arıyordum, ama fazla bir şey bulamadık. Ben kodu aşağıdaki kod HOTP oluşturmaktan sorumlu:

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

Karşı karşıyayım sorun yukarıdaki kodu Google Doğrulayıcı kullanarak oluşturulan aynı değildir kullanarak parola oluşturmak için Android app. intervals_no birden çok değer (ilk 10000, intervals_no = 0 ile başlayan tam olarak), secret anahtar GA uygulaması içinde sağlanan eşit olmak, ben denedim bile.

Sorular için

Benim sorular şunlardır:

  1. Neyi yanlış yapıyorum?
  2. Nasıl Python HOTP ve/veya TOTP oluşturabilirsiniz?
  3. Bunun için varolan herhangi bir Python kütüphaneleri var mı?

Özetle: lütfen bana Python içinde Google Doğrulayıcı kimlik doğrulama kodu. uygulamanıza yardımcı olacak herhangi bir ipucu ver

CEVAP
18 Aralık 2011, Pazar


Ödül ayarlamak için sorumu istedim, ama çözüm yaratmayı başarmıştır. Benim sorunum secret anahtarı yanlış değeri (base64.b32decode() fonksiyonu parametre için doğru olmalı) ile bağlı gibi görünüyordu.

Ben bunu kullanmak için nasıl bir açıklama ile Tam Çözüm yazı aşağıda.

Kod

Aşağıdaki kod yeterlidir. Ayrıca bunun için ayrı bir modül olarak GitHub için yükledimonetimepass(burada mevcuttur: https://github.com/tadeck/onetimepass).

import hmac, base64, struct, hashlib, time

def get_hotp_token(secret, intervals_no):
    key = base64.b32decode(secret, True)
    msg = struct.pack(">Q", intervals_no)
    h = hmac.new(key, msg, hashlib.sha1).digest()
    o = ord(h[19]) & 15
    h = (struct.unpack(">I", h[o:o 4])[0] & 0x7fffffff) % 1000000
    return h

def get_totp_token(secret):
    return get_hotp_token(secret, intervals_no=int(time.time())//30)

İki işlevi vardır:

  • get_hotp_token() zaman belirteci (tek kullanımdan sonra geçersiz) oluşturur
  • get_totp_token() (30 saniyelik aralıklarla değişti), temel bir simge oluşturur

Parametreleri

Parametreleri gelince:

  • secret gizli bir değer, sunucu (yukarıdaki komut) ve istemci (Google Doğrulayıcı, uygulama içinde şifre sağlayarak), bilinmektedir
  • intervals_no sayı belirteci her nesil (belki de bu son başarılı bir geçmişe kontrol ettikten sonra tamsayılar bazı sonlu sayıda kontrol ederek sunucudaki çözülmesi gerekir) sonra incremeneted

Nasıl kullanılır

  1. Kesinlikle script ve Google Doğrulayıcı hem çalıştı secret (base64.b32decode() doğru parametre olmalıdır) - tercihen 16-char (= iz) oluşturmakta.
  2. Eğer isterseniz kullanın get_hotp_token() tek seferlik şifreler her kullanımdan sonra suya düştü. Google Doğrulayıcı sayacı dayalı olarak bahsettiğim şifreleri bu tip. Kontrol üzerinde server var o kontrol çeşitli değerler intervals_no (olarak hiçbir garanti ve kullanıcı vermedi oluşturmak pass arasındaki istekleri nedense), ama az daha son çalışma intervals_no değeri (böylece muhtemelen deposu bir yerde).
  3. Eğer 30 saniyelik aralıklarla bir belirteç çalışmak istiyorsanız get_totp_token() kullanın. Her iki sistem de doğru zaman ayarlanmış olduğundan emin olmak için (onlar zaman içinde herhangi bir anda aynı Unix zaman damgası oluşturmak her iki anlamına gelir).
  4. Kaba kuvvet kendinizi korumak için saldırı emin olun. Eğer zaman tabanlı bir parola kullanılıyorsa, sonra 30 saniyeden az bir sürede 1000000 değerleri çalışıyorum şifreyi tahmin 0 şans verir. HMAC tabanlı passowrds durumunda (HOTPs) bile daha kötü görünüyor.

Örnek

Tek seferlik HMAC tabanlı şifre için: aşağıdaki kodu kullanırken

secret = 'MZXW633PN5XW6MZX'
for i in xrange(1, 10):
    print i, get_hotp_token(secret, intervals_no=i)

aşağıdaki sonucu alırsınız:

1 448400
2 656122
3 457125
4 35022
5 401553
6 581333
7 16329
8 529359
9 171710

belirteçleri Google kimlik uygulaması tarafından oluşturulan 6 işaretler, uygulaması daha kısa ekler başına sıfır 6 karakter uzunluğunda ulaşmak için hariç) ilgili olan.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Adam Khoury

    Adam Khoury

    23 Ocak 2008
  • Breno Rises

    Breno Rises

    7 Ocak 2014
  • Attempts at least

    Attempts at

    1 Ocak 2007