工程手记

密码,不该由我保管

两层加密保护远程桌面凭据,本机用 DPAPI 便利性换易用性,备份用 PBKDF2 固定 60 万迭代;为什么迭代次数不可配置,性能数据如何解读。

远程服务器资料管理工具需要妥善保存账户凭据。这个工具采用两层加密设计:本机存储用 Windows DPAPI,备份使用基于密码的密钥派生。两层各有边界,理解这些边界对使用决策至关重要。

第一层:DPAPI 的便利与代价

本机存储的凭据使用 Windows DPAPI(Data Protection API)加密,由当前 Windows 用户身份保护。这是 Windows 内置的用户级加密机制,密钥由操作系统管理,与登录用户的 SID 和机器的本地安全数据库绑定。不需要用户记一个额外的主密码,启动应用即可直接使用保存的凭据。

DPAPI 的好处显而易见:启动应用即用,无需输入密码,用户体验最优。代价是它的加密密钥锁定在当前用户、当前机器。凭据无法直接迁移到另一台电脑或另一个 Windows 用户——这不是工具的限制,而是 DPAPI 的设计约束。Windows 操作系统就是这样设计的,其他工具也无法绕过。

实际操作中的含义很明确:

  • 重装 Windows 前必须先导出备份。原有凭据会因为用户 SID 变化和机器密钥更新而无法解密,即便登录同一账户也不行。
  • 更换电脑前需要先创建备份并妥善保存备份密码,目标电脑上导入时需要重新输入这个备份密码。
  • 在同一电脑上切换 Windows 用户登录,旧用户的凭据对新用户完全不可见,因为加密密钥是用户级的。
  • 多用户共享一台电脑的场景下,凭据不会跨用户暴露。

这些限制会在实际使用中暴露出来——比如忙于工作时重装系统忽略了导出,或者在公用工作电脑上多个人使用。正因为如此,工具强制要求提供备份机制。备份不是可选功能,而是必需的。

第二层:备份加密的固定迭代设计

备份采用 PBKDF2-SHA256(基于密码的密钥派生函数 2,使用 SHA-256 哈希)加密,固定执行 600,000 次迭代。用户创建备份时设置一个密码,导入时输入这个密码。PBKDF2 通过重复应用哈希函数来增加破解难度,迭代次数越多,从密码派生密钥所需的计算时间越长,攻击者进行暴力破解也需要投入成倍的计算资源。

600,000 次迭代的来源是什么?这是一个有意识的设计决定,而不是随意选择。迭代次数越多,暴力破解的成本越高,但加密和解密的耗时也越长。设计者需要在两者之间找到平衡点:够强以抵御现代硬件的破解能力,又不能强到让普通用户的导入操作变得难以忍受。600,000 次这个数字反映的是这个平衡的结果。

为什么固定而非可配置?这是一个纪律问题。可配置听起来更灵活、更给用户掌控权,但在实践中会诱使用户为了更快的备份导入速度而降低迭代次数,从而削弱安全强度。安全不应该由便利让步。人们往往倾向于选择快速方案,尤其当他们没有安全专业知识时。固定的迭代次数消除了这种选择权,保证了所有备份都有相同的防护等级。工具的职责是做出最合理的决定,而不是把这个决定推给用户。

性能实测与数据解读

在 Windows 11 构建机上,对 1 MiB 大小的备份数据进行加密与解密的完整往返,预热缓存后的连续五次耗时分别为:108.919 ms、104.079 ms、100.418 ms、94.933 ms、103.470 ms。中位数为 103.470 ms。这意味着从你按下"导入备份"到凭据被解密并加载到内存,大约需要 100 毫秒的等待时间。

这组数据收集的目的是记录性能表现。它提供了一个具体的参考:用户在 Windows 11 系统上可以预期导入备份的延迟大约是这个量级。这对评估工具的可用性很有用。但它明确作为调整迭代次数的依据。这种表述听起来有些冗余,但它是设计纪律的一部分——必须写下来的目的是防止后续有人看到"100 毫秒确实有点慢"就建议降低迭代次数。防止的是这样的推理:因为性能数据显示延迟不够快,所以降低迭代次数。这个逻辑链条在安全工程中是禁止的。

相反,如果实践证明 100 毫秒对用户体验构成问题,正确的做法是要么接受这个成本作为安全性的代价,要么在未来硬件更新换代后自然加速。绝不是削弱密钥派生强度。性能和安全的权衡应该在上层的需求决策中做,而不是在密码学参数中做。

工具的明确边界

这个工具的安全设计有明确的保护范围和限制:

DPAPI 层的限制:本机凭据的安全性最终依赖于 Windows 用户密码。如果 Windows 账户被破解,攻击者用该账户登录电脑,DPAPI 解密会自动进行。如果用户以管理员身份运行工具(虽然不需要管理员权限),攻击者获得管理员权限后理论上也可能绕过某些保护。安全链的强度由最弱的一环决定——如果你的 Windows 用户密码很弱,或者电脑物理上被他人访问,DPAPI 的保护就名存实亡。

备份密码的强度:导入备份时用户设置的密码决定了备份的抗暴力破解能力。PBKDF2 提供的防护再强,也无法弥补一个简单密码的缺陷。"123456"这样的备份密码,在 600,000 次迭代和现代 GPU 的破解能力面前,可能在几秒到几分钟内被破解。

系统策略的约束:工具运行在 Windows 系统上,不会绕过任何系统级的安全机制。Windows SmartScreen 对未签名程序的警告、远程桌面连接的安全确认对话、Group Policy 的限制——这些工具都无法绕过。安装包为未签名的内部制品,Windows SmartScreen 会在首次运行时显示"未知发布者"警告。这不是工具的缺陷,而是系统安全策略的正常行为。

加密设计的范围:这套两层加密设计防的是离线攻击——攻击者获得了备份文件或本机的加密数据,在没有用户交互的情况下尝试破解。它防不了的情况:

  • 备份密码通过社工或偷看被直接获取
  • 备份文件在网络传输过程中被中间人截获(如果使用不安全的传输方式)
  • 凭据被恶意软件在内存中窃取(工具启动后、密码解密到内存这段时间内)
  • Windows 账户本身被已经登录电脑的恶意软件控制

对这些风险的防护需要用户在安全习惯和网络安全措施上自行补足——设置强密码、在信任的网络上操作、定期更新系统补丁、使用反恶意软件工具。

使用这套工具前要明确:本机凭据带来了便利,代价是将安全依赖在 Windows 用户身份上;备份凭据提供了迁移能力,代价是密码强度必须由用户自己把关。都不是"一次设置永久安全"的方案,都需要持续的安全意识和维护。

星野的头像

星野 XINGYE

一个人维护 AI 平台的工程师。这里记录 63 篇复盘:18 份故障档案、OTA、架构演进与工作流。