2012-03-23 11 views
1

Ich bin ein Neuling in Python. Ich versuche, mit Server unter Verwendung von Thrift ProtokollKonvertieren Thrift Objekt in SHA1 Digest

struct AuthSalt { 
    1: required i64 client, /* random data */ 
    2: required i64 server, /* data from previous answer */ 
} 

struct AuthRequest { 
    1: required AuthSalt bootstrap, 
    2: required string who,   /* login */ 
    3: required string signature,  /* SHA-1: bootstrap + password + who + bootstrap. */ 
} 

exception NotAuthorisedException { 
    1: required string description 
} 

service Bookworm { 
    AuthResponse Authenticate(1: required AuthRequest a, 2: required string locale) 
     throws (1: NotAuthorisedException e) 
} 

Ich brauche erstellen SHA1-Digest mit dieser algoritm zu arbeiten: Bootstrap + Passwort + dem + Bootstrap.

Bootstrap erstellen Ich benutze diese:

dig = hashlib.sha1 
bootstrap = AuthSalt(0, 0) 
dig.update(bootstrap) 
dig.update(password + who) 
dig.update(bootstrap) 

Aber Update Methode nur String-Argument Typ und ich kann nicht verstehen, wie Bootstrap in eine Zeichenfolge zu konvertieren.

In C++ dieser Code wie folgt aussieht:

SHA_CTX c; 
      ::SHA1_Init(&c); 
      ::SHA1_Update(&c, &bootstrap, sizeof(bootstrap)); 
      ::SHA1_Update(&c, password.c_str(), password.size()); 
      ::SHA1_Update(&c, who.c_str(), who.size()); 
      ::SHA1_Update(&c, &bootstrap, sizeof(bootstrap)); 
      ::SHA1_Final(digest, &c); 

Kann jemand erklären, wie es mit Python zu tun?

Vielen Dank im Voraus!

Antwort

1

Ich nehme an, dass str(bootstrap) anstelle von bootstrap sollte funktionieren.

+0

Nein, das ist nicht richtig. Bitte schauen Sie sich den C++ Code genau an. Wie ich verstehe, str (Bootstrap) - das ist String Repräsentation von Objekt, aber ich brauche String-Darstellung von zwei Bytes aus Bootstrap. Bootstrap ist eine Struktur (64-Bit-Ganzzahl mit Vorzeichen). str (bootstrap.client) + str (bootstrap.server) - auch nicht korrekt. – Ilya

0

Das ist, was ich brauche:

for x in tuple(struct.pack("Q",bootstrap.client)): 
    dig.update(x) 

Convert i64 in 8 Bytes und Update-Hash mit jedem Byte