浏览器已存密码写成 AES-256-GCM 之后,为什么它保护的不是「本机程序读不到」

密码管理器里那一行「已加密」,很容易被读成:本机其他程序拿不走明文。2026 年 9 月 25 日 K7 Labs 的分析又把这件事推回台面:有一类程序会读取浏览器里保存的口令、支付卡记录和会话。口令字段采用 AES-256-GCM,只说明磁盘上不是明文。能不能读出来,取决于解开这把密钥的资格落在「当前 Windows 用户」还是「浏览器程序自己」。

先记结论:AES-256-GCM 回答的是「库文件里的口令字段是不是明文」。它不回答「谁握着解开它的密钥」。谷歌在 2024 年 7 月 30 日写过,Windows 上的 DPAPI 挡的是其他用户和冷启动拷盘,挡不住以当前登录用户身份运行的程序。Chrome 127 起先把 Cookie 改成应用绑定,把这道门从「用户」收窄到「浏览器程序」。两代边界都不是「本机任何程序都读不到」。

一句话先回答搜索意图

搜「浏览器保存的密码是不是加密了所以木马也看不到」,想确认的通常是同一件事:我点过保存之后,这台电脑上的其他程序还能不能读出明文。算法名帮不上这个忙。谷歌安全博客把 Windows 上的旧边界写得很直:Chrome 用操作系统提供的数据保护接口(DPAPI)保护 Cookie 和密码这一类敏感数据,保护对象是系统上的其他用户,以及关机之后把磁盘拷走;能够以当前登录用户身份执行代码的程序不在这道门外面。

这篇文章给两类人。一类是在评审「浏览器已经加密保存,我们就不用再管口令落盘」的开发者和运维。另一类是这几天看到安全报道、想知道自己设置页里的「已加密」到底证明了什么的人。它不写如何从密码库里解出别人的口令,也不代替 密码生成器 的操作说明。你要带走的是三层可以分开核对的事实:密文证明什么、密钥包装证明什么、以及 2026 年 9 月 25 日那份报告没有证明什么。

磁盘上的 AES-256-GCM 只证明不是明文

Chromium 系浏览器把已存登录写在本机配置里。较新的口令字段用 AES-256-GCM 封装。你用文本编辑器打开那个库,看不到网站密码的原文,这是真的。GCM 在这里做的是:没有对应密钥时,改一个字节也会使校验失败,不能把密文当成可以偷偷改掉的明文。

浏览器必须在你下次打开登录框时把口令填回去,所以这把密钥不能只存在一个你自己才记得的口令里。它要能被这台机器上的浏览器在解锁会话之后拿出来用。于是真正的问题从「算法强不强」换成「谁有资格向系统要这把密钥」。算法再强,资格若落在「当前已经登录的这个 Windows 用户」,那么以这个用户身份启动的程序就和浏览器站在同一侧。

这也是它和「你自己持有口令的本地加密」不是同一句话的原因。文件若用你输入的口令在浏览器里做 AES-256-GCM,云端和别的程序默认没有这串口令,就打不开文件。浏览器密码库的设计目标是自动填写,密钥的使用资格必须留在本机的浏览器一侧。看到同一个算法名,不能把两种密钥归属当成一件事。

谷歌自己写过的那道边界

同一篇 2024 年 7 月 30 日的说明把操作系统差异也写了:macOS 走钥匙串,Linux 走系统提供的钱包(如 kwallet 或 gnome-libsecret),Windows 走 DPAPI。下面关于「当前登录用户启动的程序」的那一句,是谷歌对 Windows DPAPI 的描述,不要直接套到每一台 Mac 上。钥匙串可以弹出系统确认,边界和「任何同用户进程默默解包」不是同一套交互。

在 Windows 上,DPAPI 把密钥和这个用户的登录材料绑在一起。另一个 Windows 账户打开你的配置目录,或者有人在关机后把硬盘拆走、又没有你的登录秘密,默认解不开。这就是「加密了」在产品说明里最站得住的那一半。另一半是谷歌写明的缺口:恶意程序若已经能以当前用户身份执行,就可以走和浏览器相同的系统接口去要这把密钥。加密没有失效,门的位置本来就画在「其他用户」而不是「本用户的其他进程」。

所以评审一句「密码库采用 AES-256-GCM,因此本地恶意程序读不到」时,应把它拆开。前半句可以用库文件不是明文来支持。后半句在 DPAPI 这一代上,和谷歌的公开说明相反。需要另找证据的是:这台浏览器是否已经把这一类秘密迁到下一道门,而不是算法名本身。

Chrome 127 把边界从「用户」往「程序」收

同一篇说明接着写:Chrome 127 在 Windows 上引入应用绑定加密。数据不再允许「任何以当前用户运行的程序」来解,而是把密钥绑到浏览器程序的身份上,由系统侧组件核对调用方是不是受信任的浏览器,再交出密钥。官方写的迁移顺序是:先从 Cookie 开始;密码、支付数据和其他持久登录令牌,是打算在之后的版本扩展的对象,不是 127 发布当天已经全部迁完。

到 2026 年,取证侧的公开描述(例如 ElcomSoft 2026 年 1 月的说明)是:对已经启用应用绑定的较新 Chrome 与 Edge 配置,只按旧式「当前用户解包」去读的外部程序会失败。这道新门挡住的是「站在浏览器外面的普通进程」。它没有把「浏览器进程内部」也挡在外面。恶意扩展,或者已经在浏览器进程里执行的代码,仍然站在门内。应用绑定改变的是调用方资格,不是「只要写了 AES-256-GCM,内存里的填写逻辑就看不见口令」。

因此有两句不能互相代替。第一句:我的 Chrome 已经高于 127,所以已存密码一定迁完了。官方在 2024 年 7 月把密码写成扩展对象,你不能用版本号自动勾上这一项。第二句:新闻里还能看到有人用旧式解包读口令,所以应用绑定没有用。那只说明仍有配置或仍有数据落在旧边界上,或者样本描述的就是旧边界。它证明不了「新边界已被公开写成失效」。

你看见的说法 它能支持的结论 它支持不了的结论
口令字段是 AES-256-GCM 库文件里不是明文口令 本机任何程序都读不到
Windows 用 DPAPI 包裹密钥 其他用户、冷启动拷盘默认解不开 当前登录用户启动的程序解不开
Chrome 127 应用绑定,先覆盖 Cookie 已迁移的数据,外部程序的旧式解包会失败 密码字段在你这台机器上一定已经迁移;进程内部也读不到
密码管理器里有一条记录 这个站点曾被保存过 当前用的是哪一代密钥包装
关掉「询问是否保存密码」 之后的新登录可以不再入库 已经在库里的记录被删掉

9 月 25 日那份报告能证明什么

K7 Labs 在 2026 年 9 月 25 日发表了对一类 Windows 程序的分析,随后几天被多家安全媒体转载。报告称:该程序会从多款 Chromium 系浏览器读取已存密码、支付卡记录、浏览历史和会话,并读取 Firefox 的历史与 Cookie;较新的口令字段按 AES-256-GCM 存放,密钥则通过 Windows 的用户级数据保护解开。K7 写明,他们没有确认这套程序被传播到多广、影响了多少台机器。

这份描述对得上上一节的旧边界:资格在「当前用户」,同一次登录里的程序可以站到门内,AES-256-GCM 只负责字段不是明文。它没有写成「已经绕过 Chrome 的应用绑定」,也没有给出可以换成「你的 Chrome 一定中招」的受害人数。把标题里的算法名理解成「加密已失效」,或者理解成「所以我的密码库绝对安全」,都多走了一步。

报告还提醒另一件容易混在一起的事:会话和已存密码是两份材料。会话被带走之后,攻击者可以在一段时间内直接使用你已经登录的状态。你在原网站改掉密码,作废的是下一次口令登录,不一定作废已经发出的会话。要处理会话,得到账号的设备或会话列表里退出,或等网站主动吊销。这和「密码库加密强不强」无关。更早关于「改密码挡不住已登记会话」的核对,见通行密钥那篇,不要把两件事合成一个开关。

不要为了「验证新闻是不是真的」去解自己的密码库,也不要用真实网银、邮箱或云控制台口令做实验。下面的核对只看设置页里有没有保存记录、保存提示是否还开着。解出明文、导出整库,都不在本文的核对范围内。

当场核对:看清单,不拆数据库

口号和新闻标题都不能代替你这台浏览器的设置。准备一个可丢弃的测试站点账号即可。下面四步在当前浏览器里做完,不需要把配置目录拷出来。

  1. 打开浏览器自带的密码管理器(设置中的「密码 / 自动填充」,或地址栏进入该浏览器的密码管理页)。只看站点列表:邮箱、网银、云控制台、代码托管有没有各占一行。不要点显示明文,不要导出。
  2. 找到「询问是否保存密码」或等价开关。它决定下一次登录会不会再入库。关掉它不会删除已经存在的记录;要删得在列表里逐条移除,或使用浏览器提供的清除已存密码。
  3. 打开「关于」页,确认浏览器仍在接收官方更新,记下版本号。版本号证明不了密码字段已经迁到应用绑定。设置页也不会打印 DPAPI 或应用绑定这几个字。不要为此去翻配置目录里的密钥前缀。
  4. 若你怀疑这台电脑已经在跑来路不明的程序:不要在这台机器上点「显示密码」。换一台你还信任的设备,到重要站点退出其他会话并更换口令。各站口令不要复用。这一步处理的是影响,不是在本机上把密码库解开来「看看到底能不能读」。

版本号回答不了密钥在哪一代

Chrome 127 是应用绑定开始覆盖 Cookie 的版本,不是「所有已存密码在这一天改了包装」的版本。你看到 130、140 或更高,只能说明主版本已经晚于那个起点。密码字段有没有迁完,官方说明留了「之后的版本」这个范围,界面又不展示包装代数。把版本号抄进评审表,旁边应写「不能由此断定密码库已应用绑定」,而不是打一个勾。

保存提示才是入库开关

很多口令进库,不是因为某个加密页「同步上传」,而是登录成功后浏览器问了一句要不要保存,人点了保存。此后这条记录就落在上面说的那道门里面。生成一个只在本地出现的口令,只要你拒绝保存,它就不会变成密码管理器里的一行。拒绝保存证明不了页面脚本没有把口令发出去,那要用网络面板另核;它只证明你没有把这串交给浏览器的已存密码清单。

四种把「已加密」读过头的情况

第一,把 AES-256-GCM 读成「恶意程序读不到」。这个算法说明字段不是明文,也说明没有密钥就改不了密文。密钥若用 DPAPI 包给当前用户,谷歌已经写明:以该用户身份运行的程序不在保护范围外。算法名和门的位置是两行字。

第二,把「我有 Windows 登录密码」读成「密码库对木马免疫」。登录密码的作用,是让别的账户和冷启动拷盘解不开 DPAPI。程序若已在你登录之后运行,它使用的就是这个已解锁的用户环境。登录密码仍要设,它回答的是另一道门。

第三,把「版本高于 127」读成「已存密码和 Cookie 都已应用绑定,进程内部也看不见」。官方写的起点是 Cookie,密码是扩展对象。应用绑定挡住的是浏览器外面的旧式解包。扩展和已经在浏览器进程里执行的代码,不因这道门而突然变成盲的。

第四,把「每个站用了不同口令」读成「整库被读走也没关系」。不同口令能拦住的是:一个网站的库泄露之后,拿同一串去撞你的邮箱和云控制台。它拦不住「程序一次读走密码管理器里全部已存记录」。两道控制都值得做,它们覆盖的失败不是同一种。

常见问题

密码管理器显示已加密,是不是本机其他程序就读不到?

不能这么读。已加密只说明磁盘上的口令字段不是明文。在 Windows 的 DPAPI 这一代,谷歌写明挡的是其他用户和冷启动拷盘,挡不住以当前登录用户身份运行的程序。Chrome 127 起的应用绑定先覆盖 Cookie,外部程序对已迁移数据的旧式解包会失败;浏览器进程内部仍然读得到。界面上的「已加密」三个字,不会告诉你这台机器的密码字段落在哪一代。

Chrome 127 的应用绑定,是不是等于恶意程序也解不开已存密码?

不是。2024 年 7 月 30 日的说明把密码和支付数据写成打算在之后版本扩展的对象。应用绑定把资格从「当前用户」收窄到「被系统组件认可的浏览器程序」。这能解释为什么只走旧式用户解包的外部程序,在已迁移的数据上会失败。它不说明进程内部的代码被挡在门外,也不说明你这台浏览器的每一条已存密码都已经完成迁移。

9 月 25 日的报告,是不是说明我的 Chrome 密码已经能被任意程序读走?

不能直接换成这个结论。报告描述的是一类 Windows 程序会读取多款 Chromium 系浏览器的已存密码、支付卡、历史和会话,以及 Firefox 的历史和 Cookie,并称口令字段使用 AES-256-GCM、密钥走用户级数据保护。K7 没有给出受害人数,也没有把该样本写成已经绕过应用绑定。你自己的浏览器落在哪一代,要看保存清单和是否仍在更新,而不是用这篇报道的算法名代替。

改掉网站密码之后,已经保存的会话会不会一起失效?

不一定。改密码作废的是下次用这串口令登录。已经发出的会话,往往还要在账号的设备列表里退出其他会话,或由网站吊销。同一类程序会把会话和已存密码一起拿走。只改一处口令、不退出其他会话,处理的是口令,不是会话。

用打开即用的生成器对照一次「不入库」

若你想看清「口令出现过」和「口令进入浏览器密码库」不是同一步,可以打开 FastPwd 的 密码生成器。无需注册。随机模式用默认 16 位,生成一串可丢弃的口令。浏览器若弹出保存提示,选择不保存。再回到密码管理器,列表里不应新增刚才那个测试站点。FastPwd 自己不维护密码库,也不会替你写入浏览器的已存密码清单。

生成使用 crypto.getRandomValues。长度 6–128 位,默认 16 位;低于 8 位会提示安全性较低。结果默认不上传。打开开发者工具的 Network,勾选保留日志,用整串口令搜索请求行和请求体,业务请求里不应出现这串。这一步证明的是「这次没有作为 HTTP 正文离开标签页」,证明不了本机恶意程序读不到页面或剪贴板。若这台电脑已经不可信,换一台设备再生成、再登录。

生成之后若还要看这串像不像公开高频名单里的弱口令,另取一串可丢弃的测试字符,在 密码检测 里对照。待测密码不上传。未命中不能证明全网没见过,命中只说明太常见。不要把刚要启用的真口令贴进检测框,也不要把浏览器密码库整库导出再拿去检测。

若这串口令必须交给另一个人一次,不要贴进会进服务器日志的工单正文,改走 阅后即焚:服务端只暂存密文,密钥放在链接的 # 后面,创建和阅读都无需账号。那条通道回答的是「怎样交一次」,不是「怎样让已经保存在浏览器里的旧口令变安全」。旧记录仍要在密码管理器里删除,并在你信任的设备上更换。

延伸阅读

页面上的「本地、不上传」要用金丝雀在 Network 里搜,见 浏览器本地加密怎么核对明文没有离开本机。改密码挡不住已经发出的会话,见 打电话让你更新通行密钥,为什么这招偷走的是会话而不是 Passkey。本地弱口令名单能抓住常见弱密码、不能当成全网撞库,见 本地弱口令名单能证明什么,为什么它不是全网撞库。