Skip to content

[Feature]: 使用 Windows DPAPI / 凭据管理器保护本地记住的主密码 #459

Closed

Description

@cozyboy

你的建议 / Your suggestion

希望改进“记住主密码”的本地存储实现,Windows 下使用 DPAPI(当前用户作用域)或 Windows Credential Manager,替换程序内置固定密钥加密文件的方式。

查看当前 main(6773a65)发现,crates/core/src/key_storage.rs 中仅使用 LocalFileStorage:通过源码内的 LOCAL_STORAGE_FIXED_KEY 对主密码进行 AES-256-GCM 加密,再保存至本地 key_storage 文件;读取时使用相同固定密钥恢复。

这意味着拿到该文件的人可依据公开实现恢复主密码,再解密对应的连接凭据,主密码本身再强也无法保护这个自动解锁副本。这里讨论的是本地文件泄露后的保护能力,并不是说作者已经读取或上传了用户主密码。

建议:

  1. Windows 安装版使用 CryptProtectData / CryptUnprotectData 的当前用户作用域,或通过 CredWrite / CredRead 保存自动解锁所需的秘密;避免采用允许本机所有用户解密的机器作用域。
  2. macOS / Linux 可分别对接系统钥匙串 / Secret Service;系统安全存储不可用时,提示每次启动手动输入,不静默退回固定密钥。
  3. 升级时提供旧 key_storage 的一次性迁移:新存储写入并验证成功后,再删除旧副本。
  4. 便携版默认手动输入;若选择绑定本机的系统存储,明确提示移动到其他电脑后需要重新输入主密码。
  5. 在设置和文档中说明自动解锁的保护边界:系统保护可降低单独复制数据文件的风险,但不能保证抵御同用户权限下的恶意程序或恶意客户端。

这个改进可以保留自动解锁的便利,同时避免所有用户的本地主密码副本共用公开固定密钥。

补充信息 / Additional context

源码依据(静态阅读,未对发布安装包做运行时验证):

const LOCAL_STORAGE_FIXED_KEY: &[u8; 32] = b"onehub-local-dev-key-2025-fixed!";

Windows 官方参考:
https://learn.microsoft.com/en-us/windows/win32/api/dpapi/nf-dpapi-cryptprotectdata
https://learn.microsoft.com/en-us/windows/win32/secbp/handling-passwords

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions