如何使用Python解密Windows DPAPI中存储的Secure String?
解密PowerShell存储的DPAPI加密Secure String
要解密PowerShell生成并存储的Secure String,核心是调用Windows系统的DPAPI(数据保护API)——因为Read-Host -AsSecureString生成的Secure String本质是通过当前用户的DPAPI密钥加密的字节流,通常会被转成Base64字符串存储(比如配合ConvertFrom-SecureString命令)。以下是具体的Python实现方案:
前提条件
- 安装
pywin32库(用于调用Windows系统API),执行pip install pywin32即可完成安装 - 必须在加密该Secure String的同一Windows用户账户下运行解密代码,DPAPI是用户级加密机制,跨用户无法解密
实现代码
import win32crypt import base64 def decrypt_powershell_secure_string(encrypted_base64): # 将Base64编码的加密内容解码为字节流 encrypted_data = base64.b64decode(encrypted_base64) # 调用DPAPI解密,第二个参数传None表示使用当前用户的DPAPI密钥 decrypted_raw, _ = win32crypt.CryptUnprotectData(encrypted_data, None, None, None, 0) # PowerShell内部用UTF-16LE编码存储字符串,解码得到明文 return decrypted_raw.decode('utf-16le') # 示例:从存储文件读取加密字符串 with open('auth_token_secure.txt', 'r') as f: encrypted_content = f.read().strip() # 解密并输出结果 plain_auth_token = decrypt_powershell_secure_string(encrypted_content) print(f"解密后的Auth-Token: {plain_auth_token}")
关键说明
- PowerShell的
ConvertFrom-SecureString输出的是Base64格式的DPAPI加密数据,因此第一步必须解码为原始字节流 win32crypt.CryptUnprotectData是Windows原生解密函数,会自动匹配当前用户的DPAPI上下文,无需手动提供密钥- 解密后的原始字节采用UTF-16LE编码,这是PowerShell存储字符串的标准编码格式,必须对应解码才能得到正常明文
特殊场景提示
如果存储的Secure String是通过ConvertFrom-SecureString -Key指定自定义密钥加密的,上述方法不适用——此时需要用对应的自定义密钥手动实现AES-256-CBC解密,但这种情况不属于你提问的默认场景。
内容的提问来源于stack exchange,提问作者user19736286
相关产品推荐
相关产品推荐

