【发布时间】:2010-03-03 19:32:06
【问题描述】:
我正在尝试散列密码以转储到 .rdp 文件中。我发现一个网站(或多或少)展示了如何做到这一点here,但它在 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
好的,我以前见过这个错误,通常这只是意味着我需要先转换为字节,所以:
>>> pwdHash = win32crypt.CryptProtectData("password".encode(),'psw',None,None,None,0)
>>> print(str(binascii.hexlify(pwdHash)).upper())
B'01000000D08C9DDF0115D1118C7A00C04FC297EB010000007E9E... blah, blah, blah
>>>
这看起来一切都很好,但是当您将该十六进制值转储到 .rdp 文件时不起作用,我只能假设这是因为它不是 unicode 字符串“密码”的十六进制密码,而是字节“密码”的十六进制密码。我尝试了 .decode() 但这正是您所期望的,并将十六进制加密字节转换为字符串,它不会为您提供原始 unicode 字符串的十六进制加密字符串。
我已经疯狂地搜索有关 win32crypt.CryptProtectData 的任何信息,但我找不到任何有用的信息来说明为什么它现在需要字节或缓冲区对象而不是字符串。
有人可以帮忙吗?
(或者有谁知道一种更简单的方法将密码输入到我通过 Python 以编程方式打开的远程桌面会话中?呵呵)
【问题讨论】:
-
我认为转换为字节会失去 unicode 支持,但您可以通过转储字节来确认这一点,密码应该是 0x70,0x00,0x61,0x00,0x73,0x00,0x73 等.如果你得到 0x70,061,0x73... 那么你有 ansi 而不是 unicode... 检查我写的关于密码哈希的其他文章可能是值得的:remkoweijnen.nl/blog/2007/10/18/how-rdp-passwords-are-encryptedremkoweijnen.nl/blog/2007/10/17/launch-rdp-from-commandlineremkoweijnen.nl/blog/2008/03/02/…
-
您提供的代码就是有效的代码。不是 not 起作用的。向我们展示不起作用的代码和错误。
标签: python winapi python-3.x remote-desktop python-2.5