Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Получить SHA1 дайджест от объекта (Python) / 1 сообщений из 1, страница 1 из 1
23.03.2012, 17:01:36
    #37720460
Duncan MacLeod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить SHA1 дайджест от объекта (Python)
Здравствуйте!

Пытаюсь работать с Thrift (IDL ниже)

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
struct AuthSalt {
    1: required i64 client,   /* случайные данные генерируемы клиентом. */
    2: required i64 server,   /* salt-данные из предыдущего ответа сервера. */
}
 
struct AuthRequest {
    1: required AuthSalt bootstrap,
    2: required string who,           /* логин пользователя. */
    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 )
}


Сгенерировал файлы, теперь пытаюсь работать с сервисом. Проблема в следующем, я не понимаю как получить дайджест.

Для генерации SHA использую: dig = hashlib.sha1(), судя по описанию, то получить дайджест я могу последовательным вызовом dig.update(string).

Код: python
1.
bw_authsalt = AuthSalt(0,0) #создаем объект, который будем использовать при создании AuthRequest



реализация подписи представляется мне примерно так:

Код: python
1.
2.
3.
dig.update(bw_authsalt)
dig.update(password + login)
dig.update(bw_authsalt)



Но метод update на вход получает только строку. Соответственно у меня вопрос, как мне структуру к строке преобразовать правильно, чтобы вызвать метод? На Си этот код выглядит вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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);



Это была первая часть проблемы.

Вторая часть проблемы в том, что я решил создать объект без корректного дайджеста и вызвать метод Authenticate - ожидал получить exception NotAuthorisedException, но вывалилось с:

Цитата
авторTraceback (most recent call last):
File "./bw_client.py", line 44, in <module>
client.Authenticate(bw_authreq, 'rus')
File "./gen-py/bookworm/Bookworm.py", line 50, in Authenticate
self.send_Authenticate(a, locale)
File "./gen-py/bookworm/Bookworm.py", line 58, in send_Authenticate
args.write(self._oprot)
File "./gen-py/bookworm/Bookworm.py", line 213, in write
self.a.write(oprot)
File "./gen-py/bookworm/ttypes.py", line 161, in write
oprot.writeString(self.digest)
File "/usr/local/lib/python2.6/dist-packages/thrift/protocol/TBinaryProtocol.py", line 122, in writeString
self.writeI32(len(str))
TypeError: object of type '_hashlib.HASH' has no len()

Я нашел, где пишут про мою ошибку: вот тут , но не понял как лечить. Подскажите пожалуйста, что не так делаю. В Pythone начинающий совсем. Спасибо.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Получить SHA1 дайджест от объекта (Python) / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]