Python win32crypt.CryptProtectData 2.5与3.1的区别?

2 投票
1 回答
5876 浏览
提问于 2025-04-15 19:58

我正在尝试把一个密码进行哈希处理,以便放进一个 .rdp 文件里。我找到一个网站,基本上教了我怎么做,在这里,但在 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 字符串 'password' 的十六进制加密,而是字节 'password' 的十六进制加密。我尝试过 .decode(),但那只是把十六进制加密的字节变成了字符串,并没有给我原始 unicode 字符串的十六进制加密。

我在网上疯狂搜索关于 win32crypt.CryptProtectData 的信息,但找不到任何有用的资料,搞不清楚为什么现在需要字节或缓冲对象,而不是字符串。

有人能帮忙吗?
(或者有没有人知道更简单的方法,可以通过 Python 程序化地把密码输入到我打开的远程桌面会话中?嘿嘿)

1 个回答

2

请使用 "password".encode('utf-16-le') 这个方式。

撰写回答