2012-03-23 46 views
1

我是Python中的新手。我嘗試使用節儉協議將Thrift對象轉換爲SHA1摘要

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) 
} 

我需要使用這個algoritm創建SHA1摘要與服務器一起工作:引導+密碼+誰+引導。

要創建引導我用這個:

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

更新方法的參數類型隻字符串,我不知道如何引導轉換爲字符串。

在C++代碼如下所示:

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); 

有人能解釋如何使用Python辦呢?

在此先感謝!

回答

1

我想str(bootstrap)而不是bootstrap應該工作。

+0

不,這是不正確的。請仔細查看C++代碼。據我瞭解str(bootstrap) - 這是對象的字符串表示,但我需要從bootstrap開始的兩個字節的字符串表示。 Bootstrap是結構(64位有符號整數)。 str(bootstrap.client)+ str(bootstrap.server) - 也不正確。 – Ilya 2012-03-24 07:26:02

0

這是什麼,我需要:

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

轉換成I64 8個字節和更新哈希每字節