2 Stimmen

Python win32crypt.CryptProtectData Unterschied zwischen 2.5 und 3.1?

Ich versuche, ein Passwort zu hashen, um es in eine .rdp-Datei zu dumpen. Ich habe eine Seite gefunden, die mehr oder weniger zeigt, wie das geht hier, aber es funktioniert nicht in 3.1.

In 2.5.4 erhalte ich dies:

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

In 3.1 erhalte ich dies (alles ist Unicode in 3.1, also einfach das u" verwerfen?):

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

OK, diesen Fehler habe ich schon einmal gesehen und normalerweise bedeutet das einfach, dass ich zuerst in Bytes konvertieren muss, also:

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

Das scheint alles gut und schön zu sein, aber das funktioniert nicht, wenn Sie diesen hexed-Wert in eine .rdp-Datei dumpen, ich kann nur annehmen, dass dies daran liegt, dass es kein hex-crypt des Unicode-Strings 'password' ist, sondern ein hex-crypt der Bytes 'password'. Ich habe versucht, ein .decode() durchzuführen, aber das macht nur das, was man erwarten würde, und macht die hex-crypt Bytes zu einem String, es gibt Ihnen nicht den hex-crypt String für den originalen Unicode-String.

Ich habe wie verrückt nach Informationen zur win32crypt.CryptProtectData gesucht und ich kann keine nützlichen Informationen darüber finden, warum es jetzt ein Bytes- oder Pufferobjekt anstelle eines Strings erfordert.

Kann mir jemand helfen?
(oder kennt jemand einen einfacheren Weg, ein Passwort in eine Remote-Desktop-Sitzung einzuspeisen, die ich programmgesteuert über Python öffne? hehe)

2voto

bdew Punkte 1310

Verwenden Sie stattdessen "password".encode('utf-16-le').

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X