Python win32crypt.CryptProtectData与2.5和3.1的区别?
问题描述:
我试图散列密码来转储到一个.rdp文件。我发现一个网站(或多或少)显示如何做到这一点here,但它不适用于3.1。Python win32crypt.CryptProtectData与2.5和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的Unicode所以只是沟U”吧?):
>>> 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
OK,我已经看到了错误之前,通常这只是意味着我需要先转换为字节,所以:
>>> pwdHash = win32crypt.CryptProtectData("password".encode(),'psw',None,None,None,0)
>>> print(str(binascii.hexlify(pwdHash)).upper())
B'01000000D08C9DDF0115D1118C7A00C04FC297EB010000007E9E... blah, blah, blah
>>>
这似乎一切顺利,好bu当你将这个hexed值转储到.rdp文件时,t不起作用,我只能假设这是因为它不是unicode字符串'password'的十六进制加密,而是字节'password'的十六进制加密, 。我尝试了一个.decode(),但它的确如你所期望的那样,并将十六进制字节变成了一个字符串,它不会给你原来unicode字符串的十六进制字符串。
我疯狂地搜索了win32crypt.CryptProtectData上的任何信息,并且找不到任何有用的信息,为什么它现在需要字节或缓冲区对象而不是字符串。
任何人都可以帮忙吗?
(或没有人知道一个简单的方法来养活一个密码到远程桌面会话,我通过的Python编程打开?嘿嘿)
答
使用“密码” .encode(“UTF-16乐”),而不是。
我认为转换为字节失去了Unicode支持,但您可以通过转储字节来确认这一点,密码应该是类似于0x70,0x00,0x61,0x00,0x73,0x00,0x73等等。如果你得到0x70,061,0x73 ...那么你有ansi而不是unicode ...可能值得去检查我写的关于密码散列的其他文章: http://www.remkoweijnen.nl/blog/ 2007/10/18 /如何-RDP-密码-被加密/ http://www.remkoweijnen.nl/blog/2007/10/17/launch-rdp-from-commandline/ HTTP:// www.remkoweijnen.nl/blog/2008/03/02/how-rdp-passwords-are-encrypted-2/ – Remko 2010-07-14 11:44:57
你给的代码是有效的代码。不* *不*工作。向我们展示不起作用的代码和错误。 – 2011-02-19 22:41:11