Skip to main content
 首页 » 编程设计

Python win32crypt.CryptProtectData 2.5 和 3.1 之间的区别

2025年05月04日13lvdongjie

我正在尝试散列密码以转储到 .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 字符串的十六进制加密字符串。

我疯狂地在 google 上搜索有关 win32crypt.CryptProtectData 的任何信息,但我找不到任何有用的信息来说明为什么它现在需要字节或缓冲区对象而不是字符串。

有人可以帮忙吗?
(或者有人知道一种更简单的方法可以将密码输入我通过 Python 以编程方式打开的远程桌面 session 吗?呵呵)

请您参考如下方法:

改用“密码”.encode('utf-16-le')。