2010-03-03 41 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樂」),而不是。