2010-03-03 42 views
2

我试图散列密码来转储到一个.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编程打开?嘿嘿)

+0

我认为转换为字节失去了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

+0

你给的代码是有效的代码。不* *不*工作。向我们展示不起作用的代码和错误。 – 2011-02-19 22:41:11

回答

1

使用“密码” .encode(“UTF-16乐”),而不是。