Конвертировать объект Thrift в дайджест SHA1 - PullRequest
1 голос
/ 24 марта 2012

Я новичок в Python. Я пытаюсь работать с сервером по протоколу Thrift

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

Мне нужно создать дайджест SHA1, используя этот алгоритм: bootstrap + пароль + who + bootstrap.

Для создания начальной загрузки я использую это:

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?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Полагаю, что str(bootstrap) вместо bootstrap должно работать.

0 голосов
/ 26 марта 2012

Это то, что мне было нужно:

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

Преобразование i64 в 8 байтов и обновление хеша каждым байтом

...