Edge 密码同步 1046 条却全部失败:从 Model error type 10 定位到 Windows DPAPI

Edge 密码同步 1046 条却全部失败:从 Model error type 10 定位到 Windows DPAPI

问题现象

Edge 的其他同步项目基本正常,但密码始终无法完成同步。

edge://sync-internals/中,Passwords 一项显示:

Passwords 1046 1046 Error: MergeFullSyncData@ components\password_manager\core\browser\sync\password_sync_bridge.cc:774 Model error type: 10 Failed

最初看起来像是 Edge 配置文件、云端数据或网络出了问题。但进一步分析后发现,真正的问题在 Windows 的用户数据加密系统 DPAPI。

分析过程

1. 确认云端数据是否正常

查看 Edge 的同步诊断日志:

%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\ Sync Data\Logs\sync_diagnostic.log

日志显示密码数据被分批成功下载:

ProcessGetUpdates dataType: Passwords process_failed_to_decrypt: 0 process_success: 250

全部批次合计:

云端记录总数:1128 删除记录:82 有效密码:1046 解密失败:0

这说明:

  • Microsoft 账号正常
  • 网络正常
  • Edge 能连接同步服务器
  • 云端密码可以正常解密
  • 1046 条密码仍然存在于云端

因此,问题不在云端,而是在写入本地密码库的阶段。

2. 检查本地密码数据库

Edge 的密码数据库主要位于:

%LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data For Account

对两个 SQLite 数据库执行完整性检查后,结果都是:

PRAGMA quick_check = ok

但相关表的记录数全部为 0:

logins=0 sync_entities_metadata=0 sync_model_metadata=0

数据库本身没有损坏,但云端密码始终无法写进去。

3. 理解 Model error type 10

查看 Chromium 对应源码后,可以确认:

Model error type: 10

对应:

kPasswordMergeAddFailed

它表示 Edge 在执行AddCredentialSync()时,无法把云端密码添加到本地密码库。

可能原因主要有:

  • 本地 SQLite 写入失败
  • 本地密码加密失败
  • Windows DPAPI 无法生成或访问用户主密钥

磁盘空间、文件权限和 SQLite 完整性都正常,所以排查方向转向了 DPAPI。

4. 测试 Windows DPAPI

可以使用 PowerShell 做一次不包含真实密码的加密往返测试:

$plain=[Text.Encoding]::UTF8.GetBytes('dpapi-self-test')$cipher=[Security.Cryptography.ProtectedData]::Protect($plain,$null,[Security.Cryptography.DataProtectionScope]::CurrentUser)$round=[Security.Cryptography.ProtectedData]::Unprotect($cipher,$null,[Security.Cryptography.DataProtectionScope]::CurrentUser)[Text.Encoding]::UTF8.GetString($round)

故障状态下,Protect()直接返回:

拒绝访问

Windows 的 DPAPI 事件日志也出现了:

Status: 0x8009000B ReasonForFailure: Could not get the master key Master key access failed

事件日志位置:

事件查看器 应用程序和服务日志 Microsoft Windows Crypto-DPAPI Operational

至此可以确定:Edge 下载密码后,需要使用当前 Windows 用户的 DPAPI 加密密码再写入数据库,但 DPAPI 主密钥不可用,所以整个同步事务被回滚。

根本原因

继续比较 Windows 登录时间和本地账户的PasswordLastSet后发现:

  • 当前 Windows 会话在修改密码之前就已经登录
  • Microsoft 账户密码在该会话期间发生过更改或重置
  • 后续一直使用 PIN、指纹或人脸解锁
  • 当前会话没有刷新 Microsoft 账户密码凭据

PIN 可以解锁 Windows,但它并不等同于 Microsoft 账户密码。某些情况下,密码修改后继续使用旧会话和 PIN,会导致 DPAPI 无法重新解锁用户主密钥。

这也是为什么重启 Edge、重置同步甚至删除 Edge 资料都不一定有效。

解决方法

1. 先备份

在进行任何操作前,建议备份:

%LOCALAPPDATA%\Microsoft\Edge\User Data\Local State %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Login Data* %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Sync Data %LOCALAPPDATA%\Microsoft\Edge\User Data\Default\Preferences %APPDATA%\Microsoft\Protect

Microsoft\Protect包含 Windows DPAPI 主密钥,不要直接删除。它不仅影响 Edge,也可能影响其他应用保存的凭据。

2. 更新并完全关闭 Edge

将 Edge 更新到最新版本,然后确认所有msedge.exe进程已经退出。

更新不是本次问题的决定性修复,但可以排除已修复的浏览器缺陷。

3. 使用 Microsoft 账户密码重新验证

先锁定 Windows:

Win + L

在登录界面选择“登录选项”,使用 Microsoft 账户密码登录,不能使用:

  • PIN
  • 指纹
  • 人脸识别

如果锁屏后使用密码仍未恢复,则完整注销 Windows,再使用 Microsoft 账户密码重新登录一次。

不要通过管理员命令重置账户密码,因为强制重置可能进一步导致旧 DPAPI 数据无法解密。

4. 重新启动 Edge

重新登录后启动 Edge,等待密码数据类型重新配置。

再次执行 DPAPI 测试,此时应当可以正常完成加密和解密。

修复结果

重新使用 Microsoft 账户密码登录后,Edge 自动恢复同步,无须删除个人资料:

Login Data: logins=1046 sync_entities_metadata=1046 sync_model_metadata=1

同步日志中不再出现新的:

MergeFullSyncData Model error type: 10

edge://sync-internals/中的 Passwords 状态也恢复正常。

总结

这次问题表面上是 Edge 密码同步失败,实际链路是:

云端密码下载成功 ↓ 云端密码解密成功 ↓ Edge 尝试写入本地密码库 ↓ Windows DPAPI 主密钥不可用 ↓ AddCredentialSync 失败 ↓ 事务回滚 ↓ Model error type: 10

遇到类似错误时,不要第一时间删除 Edge 资料或清空云端同步数据。先检查同步日志、SQLite 数据库和 Windows DPAPI 状态。尤其是在近期修改过 Microsoft 账户密码、但一直使用 PIN 登录的情况下,使用账户密码重新完成一次 Windows 身份验证,往往才是关键修复步骤。