Я пытаюсь хэшировать пароль для дампа в файл .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? хе-хе)