Windows密码查看器:DPAPI与AES解密还原浏览器保存密码

发布时间:2026/10/13 15:27:42

Windows密码查看器:DPAPI与AES解密还原浏览器保存密码 简介这是一款面向Windows用户的星号密码查看工具适合需要找回本机已保存密码的普通用户与运维人员。它支持WinXP、Win7等主流Windows平台既能查看Outlook、FTP等桌面软件窗口中的星号密码也能读取Gmail、Yahoo等网页表单里被隐藏的密码还可用于找回宽带拨号密码以及路由器中保存的ADSL账号密码覆盖场景较为全面。压缩包内共2个文件包含1个htm说明文档与1个exe可执行程序整体体积约385KB体积小巧、启动迅速操作门槛低无需复杂配置即可上手。目前已有190人浏览学习说明该工具在密码找回类需求中具有一定实用参考价值。对于忘记本机保存密码、需要快速定位并还原明文口令的读者这份资源提供了直接可用的轻量方案配合说明文档可快速了解使用方式与适用范围。1. 密码查看器从星号掩码到明文还原一个被低估的调试刚需你有没有遇到过这种场景某台老旧测试机上的数据库连接工具密码框里躺着一串星号配置文档早丢了交接的人已经离职但服务还在跑你不敢动它。或者更常见的——自己半年前在某个内部系统里设的密码浏览器自动填充了可你想把它导出来存进密码管理器却发现页面上只显示一排圆点。这时候你需要的不是“破解”而是一个能读取本机已保存凭据的密码查看器。这个资源解决的就是这类问题把 Windows 系统里那些被掩码保护的密码还原成明文包括浏览器保存的登录凭据、远程桌面连接记录、部分第三方软件的本地存储密码。它适合运维、测试、安全审计人员以及任何需要找回自己设备上已存密码的从业者。注意它的能力边界很明确——只能读取当前用户权限下、本机已经存储的凭据不能远程抓取也不能绕过系统账户认证。换句话说它是一把钥匙不是一把万能撬棍。2. 密码查看器的工作原理凭据存储位置与解密链路2.1 Windows 凭据管理器与 DPAPI 的关系Windows 从 Vista 开始引入了一套叫 DPAPIData Protection API的加密框架。简单说当你勾选“记住密码”时应用程序调用 DPAPI 的CryptProtectData函数用当前用户的登录凭据派生出的密钥对密码加密然后把密文存到某个位置。解密时调用CryptUnprotectData系统验证当前用户身份后返回明文。这意味着两件事第一密码查看器不需要知道你的 Windows 登录密码它只需要以你的用户身份运行第二如果你换了用户账户或者把文件拷到另一台机器解密会直接失败。常见做法是密码查看器启动后先枚举本机各存储点读取密文再调用 DPAPI 解密最后把结果展示出来。存储点主要有几类存储位置典型路径存什么凭据管理器%APPDATA%\Microsoft\Credentials网络共享、远程桌面凭据Web 凭据%LOCALAPPDATA%\Microsoft\CredentialsIE/Edge 旧版保存的网站密码应用程序自定义各软件安装目录或 AppData数据库工具、FTP 客户端等注册表HKCU\Software\...部分老软件的简单编码密码2.2 浏览器密码的加密差异Chrome 和 Edge 的密码存储跟系统凭据管理器是两套逻辑。它们把密码存在一个 SQLite 数据库里路径通常是%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data密码字段本身用 DPAPI 加密但加密前会先经过一次 AES 加密密钥存在同目录的Local State文件里同样受 DPAPI 保护。所以完整的解密链路是读Local State→ DPAPI 解密得到 AES 密钥 → 读Login Data里的密文 → AES 解密 → 得到明文。我一般会提醒一句如果浏览器正在运行Login Data文件可能被锁住。稳妥做法是先复制一份到临时目录再操作避免直接读原文件导致失败。2.3 密码查看器的典型功能模块一个完整的密码查看器通常包含这几个模块凭据枚举模块遍历上述存储位置收集密文和对应的目标名称。解密模块根据存储类型调用 DPAPI 或 AES 解密。展示模块以表格形式列出目标、用户名、密码、存储类型。导出模块支持导出为 CSV 或 JSON方便导入密码管理器。有些实现还会加一个“显示/隐藏”切换默认隐藏密码点击后才显示防止肩窥。这个细节在实际使用中很实用。3. 动手复现用 Python 读取本机已保存的浏览器密码3.1 环境准备与依赖安装这个脚本需要 Python 3.8 以上以及几个库pycryptodome用于 AES 解密pywin32用于调用 DPAPI。安装命令如下pip install pycryptodome pywin32如果你用的是虚拟环境先激活再装。注意pywin32在安装后可能需要运行一次python Scripts/pywin32_postinstall.py -install来注册 DLL不过大多数情况下 pip 会自动处理。3.2 读取 Local State 并解密 AES 密钥先写一个函数从Local State文件里取出加密的 AES 密钥再用 DPAPI 解密import json import base64 import win32crypt from Crypto.Cipher import AES def get_aes_key(local_state_path): with open(local_state_path, r, encodingutf-8) as f: local_state json.load(f) # 密钥以 base64 存在 os_crypt.encrypted_key 字段 encrypted_key base64.b64decode(local_state[os_crypt][encrypted_key]) # 去掉前 5 个字节的 DPAPI 前缀 encrypted_key encrypted_key[5:] # 调用 DPAPI 解密 aes_key win32crypt.CryptUnprotectData(encrypted_key, None, None, None, 0)[1] return aes_key逻辑说明Local State是一个 JSON 文件os_crypt.encrypted_key字段存的是 base64 编码的密文。解码后前 5 个字节是固定字符串DPAPI需要去掉。CryptUnprotectData返回一个元组第二个元素才是真正的明文密钥。参数None, None, None, 0分别表示附加熵、保留参数、提示信息和标志位常规调用保持默认即可。3.3 从 Login Data 中提取并解密密码接下来读取 SQLite 数据库取出每条记录的origin_url、username_value和password_valueimport sqlite3 import shutil import os def decrypt_password(encrypted_password, aes_key): # 密文前 3 个字节是版本标识 v10 或 v11 iv encrypted_password[3:15] ciphertext encrypted_password[15:-16] tag encrypted_password[-16:] cipher AES.new(aes_key, AES.MODE_GCM, nonceiv) decrypted cipher.decrypt_and_verify(ciphertext, tag) return decrypted.decode(utf-8) def read_chrome_passwords(login_data_path, aes_key): # 复制一份避免锁文件 tmp_path os.path.join(os.environ[TEMP], Login Data) shutil.copyfile(login_data_path, tmp_path) conn sqlite3.connect(tmp_path) cursor conn.cursor() cursor.execute(SELECT origin_url, username_value, password_value FROM logins) results [] for row in cursor.fetchall(): url, username, encrypted_password row if encrypted_password: try: password decrypt_password(encrypted_password, aes_key) results.append((url, username, password)) except Exception as e: results.append((url, username, f[解密失败: {e}])) conn.close() os.remove(tmp_path) return results逻辑说明Chrome 的密文结构是v10或v11前缀3 字节 随机 IV12 字节 密文 认证标签16 字节。AES-GCM 模式需要 nonce 和 tag 才能解密并验证完整性。decrypt_and_verify会在标签不匹配时抛异常这能防止密文被篡改。复制文件到临时目录是为了绕过 SQLite 的写锁读完后删除临时文件。参数方面nonce就是 IV长度固定 12 字节tag是 GCM 模式特有的认证标签长度 16 字节。如果遇到v20前缀说明是新版 Chrome 用了 App-Bound 加密这个脚本不适用需要额外处理。3.4 整合脚本与运行把上面的函数串起来if __name__ __main__: local_state os.path.expandvars(r%LOCALAPPDATA%\Google\Chrome\User Data\Local State) login_data os.path.expandvars(r%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data) key get_aes_key(local_state) passwords read_chrome_passwords(login_data, key) for url, user, pwd in passwords: print(f{url} | {user} | {pwd})运行后你会看到类似https://example.com | admin | MyPass123的输出。如果某条显示解密失败先检查 Chrome 是否在运行再确认Local State和Login Data是否属于当前用户。Edge 的路径把Google\Chrome换成Microsoft\Edge即可逻辑完全一样。提示这个脚本只应用于读取你自己设备上的凭据。在他人设备上运行前必须获得明确授权否则可能违反当地法律法规。4. 避坑与排查密码查看器翻车实录4.1 现象解密返回空值或乱码原因最常见的是用户账户不匹配。DPAPI 密钥跟当前登录用户的 SID 绑定如果你用管理员账户去读另一个标准用户的凭据CryptUnprotectData会直接失败。另一种可能是 Chrome 版本升级到了 v20 加密旧脚本不兼容。解决确认脚本以目标凭据所属用户的身份运行。如果是 v20需要改用 Chrome 提供的调试接口或者等待社区更新解密方案。乱码则多半是编码问题检查decrypted.decode(utf-8)是否应该换成latin-1或系统默认编码。4.2 现象SQLite 报 “database is locked”原因浏览器进程持有Login Data的文件锁SQLite 无法以读写模式打开。解决不要直接连原文件。先shutil.copyfile到临时目录再连副本。如果复制也失败说明文件被独占锁定可以尝试用Volume Shadow Copy或者直接关闭浏览器。我一般会先检查浏览器进程能关就关不能关就走复制路线。4.3 现象导出的 CSV 在 Excel 里打开乱码原因Excel 默认用 GBK 打开 CSV而脚本导出的是 UTF-8。解决导出时加 BOM 头或者显式指定encodingutf-8-sig。代码示例import csv with open(passwords.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([URL, Username, Password]) writer.writerows(passwords)utf-8-sig会在文件开头写入 BOMExcel 识别后就会用 UTF-8 解码。这个小坑我踩过不止一次后来养成习惯只要导出给 Windows 用户看一律用utf-8-sig。4.4 现象杀毒软件报警或直接删除脚本原因密码读取行为跟恶意软件的特征高度重合启发式引擎会误判。解决把脚本放在排除目录或者用 PyInstaller 打包成 exe 后加白名单。但更重要的是不要在未经授权的机器上运行。如果是公司内部工具提前跟安全团队报备拿到书面许可再操作。血泪经验有一次我在客户现场跑类似脚本EDR 直接隔离了文件解释了半天才说清楚。4.5 现象部分软件密码读不出来原因不是所有软件都用 DPAPI 或 Chrome 那套方案。有些用自定义加密有些用注册表简单异或还有些把密码存在内存里根本不落盘。解决先确认目标软件的存储机制。可以用 Process Monitor 监控文件读写看它启动时读了哪个文件。如果是自定义加密只能逆向分析或者找官方导出功能。密码查看器不是银弹它只覆盖主流标准方案。5. 进阶技巧把密码查看器改造成可审计的凭据导出工具前面几章把原理和基础实现讲透了这一章说点更实用的——怎么把这个脚本改成一个能生成审计报告的导出工具。核心思路是不直接打印明文而是输出一份带时间戳、机器名、用户名的结构化报告方便归档和比对。先加一个元信息收集函数import platform import getpass from datetime import datetime def get_audit_meta(): return { timestamp: datetime.now().isoformat(), hostname: platform.node(), user: getpass.getuser(), os: platform.platform() }然后改造导出逻辑支持 JSON 和 CSV 两种格式并且对密码字段做可选脱敏import json def export_report(passwords, meta, output_path, maskFalse): records [] for url, user, pwd in passwords: records.append({ url: url, username: user, password: ****** if mask else pwd }) report {meta: meta, credentials: records} with open(output_path, w, encodingutf-8) as f: json.dump(report, f, ensure_asciiFalse, indent2)参数maskTrue时密码显示为六个星号适合在演示或共享屏幕时使用。ensure_asciiFalse保证中文 URL 正常显示indent2让 JSON 可读。更进一步可以加一个“差异比对”功能每次运行都保存一份报告下次运行时自动对比新增或变更的凭据。实现方式是用url username作为主键对比两次报告的密码字段。这个功能在排查“谁改了服务密码”时特别有用。验证方法很简单先跑一次导出手动在浏览器里改一个网站的密码再跑一次看差异报告是否准确捕获。如果没捕获检查主键是否重复或者密码字段是否为空。从那以后我每次做凭据导出都强制走一遍“复制文件 → 解密 → 脱敏预览 → 确认后导出”的流程绝不直接在原文件上操作。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/13 15:27:42

腾讯广告CTR预估工业级特征工程全流程解析

简介:本资源为第一届腾讯社交广告高校算法大赛的完整参赛源码与项目说明包,面向计算机、数学、电子信息等专业的本科生及研究生,适用于课程设计、期末大作业与毕业设计参考,助力算法建模与工业级数据处理能力提升。压缩包共43个文…

2026/10/13 15:27:42

Kaggle房价预测实战:结构化数据回归建模全流程解析

1. 项目概述:为什么一个“简单”的房价预测,值得你花两小时认真拆解“简单kaggle房价预测”——这七个字在数据科学新人的收藏夹里出现频率,可能仅次于“Hello World”。但别被“简单”二字骗了。我带过十几期入门训练营,每次布置…

2026/10/13 15:17:15

前端面试必会:手写堆与优先队列实战指南

上周帮一位准备跳槽的前端朋友做模拟面试,我出了一道很常见的题:“实现一个结构,支持插入数据,并且能以 O(log n) 的代价取出当前最小值。”他脱口而出:“那我先放数组里,取的时候 sort 一下不就行了&#…

2026/10/13 16:43:16

21天敏捷生命周期实战训练:从价值流到自组织的闭环训练

1. 这不是速成班,是21天重建项目管理思维的实操训练营“敏捷项目管理21天学习计划——敏捷生命周期”,光看标题,很多人第一反应是:又一个打卡式知识付费产品?刷完21天短视频就变敏捷专家?我带过6个跨部门敏…

2026/10/13 16:43:16

Libtorch C++推理实战:从环境搭建到性能调优

1. 从Python舒适区跨到C推理:为什么值得折腾这一趟如果你平时用PyTorch训练模型,习惯了import torch之后一切顺风顺水,那么第一次听说Libtorch的时候,大概率会有两种反应:要么觉得“不就是C版的PyTorch嘛,能…

2026/10/13 16:43:16

自定义Gym环境可视化指南:从render接口到训练调试的完整方案

第一次跑通强化学习训练脚本的人,十个里有九个会在同一个地方多花两三天时间——不是算法调参,而是被自定义gym环境里的可视化绘制卡住。CartPole、MountainCar这些内置环境拿来就能用,但一旦轮到自己定义任务,状态转移、奖励函数…

2026/10/13 16:43:16

Python爬虫实战:requests+正则抓取猫眼TOP100电影榜单

简介:面向Python爬虫入门者的实战资源包,以猫眼电影TOP100榜单为案例,演示如何用requests库请求网页、用正则表达式解析电影名与评分,并说明robots.txt、请求延时、反爬应对等爬虫规范与实用技巧。整包为zip格式,共6个…

2026/10/13 16:43:16

jvisualvm实战:63个Java性能诊断场景速查指南

1. 项目概述:为什么jvisualvm不是“看看CPU就完事”的玩具jvisualvm这个名字,第一次听的人常以为是个带图形界面的top命令——点开、看个曲线、关掉。我刚接触它时也这么想,直到在某次线上服务响应延迟突增的凌晨三点,用它在3分钟…

2026/10/13 16:38:15

C语言停车场管理系统完整代码:从数据结构到计费持久化

简介:这份资源是面向C语言初学者与课程设计学习者的停车场管理系统完整代码包,围绕车辆进出登记、车位分配、计时计费与数据记录等核心业务,帮助读者理解如何用C语言实现一套可运行的管理程序。压缩包共22个文件,约1.9MB&#xff…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑