Python win32crypt.CryptProtectData разница между 2.5 и 3.1 - PullRequest
2 голосов
/ 03 марта 2010

Я пытаюсь хэшировать пароль для дампа в файл .rdp. Я нашел сайт, который (более или менее) показывает, как это сделать здесь , но он не работает в 3.1.

В 2.5.4 я получаю это:

>>> import win32crypt
>>> import binascii
>>> pwdHash = win32crypt.CryptProtectData(u"password",u'psw',None,None,None,0)
>>> print str(binascii.hexlify(pwdHash)).upper()
01000000D08C9DDF0115D1118C7A00C04FC297EB010000007E9E... blah, blah blah

В 3.1 я получаю это (все в юникоде в 3.1, так что просто угробите «правильно?):

>>> pwdHash = win32crypt.CryptProtectData("password",'psw',None,None,None,0)
Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    pwdHash = win32crypt.CryptProtectData("password",'psw',None,None,None,0)
TypeError: expected an object with a buffer interface

ОК, я уже видел эту ошибку раньше, и обычно это просто означает, что мне нужно сначала преобразовать в байты, поэтому:

>>> pwdHash = win32crypt.CryptProtectData("password".encode(),'psw',None,None,None,0)
>>> print(str(binascii.hexlify(pwdHash)).upper())
B'01000000D08C9DDF0115D1118C7A00C04FC297EB010000007E9E... blah, blah, blah
>>>

Что, кажется, все хорошо, но это не работает, когда вы записываете это шестнадцатеричное значение в файл .rdp, я могу только предположить, что это потому, что это не шестнадцатеричный крипт строки unicode 'пароль', а шестнадцатеричный код байтов 'пароль'. Я попытался .decode (), но он делает то, что вы ожидаете, и превращает байты с шестнадцатеричным шифром в строку, он не дает вам строку с шестнадцатеричным шифром для исходной строки юникода.

Я гуглил как сумасшедший для любой информации о win32crypt.CryptProtectData, и я не могу найти никакой полезной информации о том, почему теперь требуется строка байтов или буферный объект вместо строки.

Кто-нибудь может помочь?
(или кто-нибудь знает более простой способ ввода пароля в сеанс удаленного рабочего стола, который я открываю программно через Python? хе-хе)

1 Ответ

1 голос
/ 30 марта 2011

Вместо этого используйте "пароль" .encode ('utf-16-le').

...