凭证存储方式——Keychain / Windows 凭证管理器,绝不落明文
凭证安全的核心原则
OpenLess 在设计上遵循一个原则:任何 API Key、AccessToken、Secret 等敏感信息,绝不以明文形式写到磁盘。
为什么这很重要?因为很多应用会把凭据存到 .env 文件或 config.json 里,文件一旦被读走、被意外上传到 Git、或被恶意软件扫描到,凭据就泄露了。操作系统级的安全存储(Keychain / Credential Manager / keyring)是加密的、独立存储、受系统权限保护的——比文件存储安全得多。
各平台的存储位置
| 平台 | 存储后端 | Service/Label |
|---|---|---|
| macOS | 系统 Keychain | com.openless.app |
| Windows | Windows 凭证管理器(Generic Credentials) | 按凭据类型分条目 |
| Linux | 系统 keyring(如 libsecret) | 按凭据类型分条目 |
你可以在各自平台的工具里手动查看这些凭据是否存在(但不要手动删除):
- macOS:打开「钥匙串访问(Keychain Access)」应用 → 搜索
openless - Windows:打开「控制面板 → 凭据管理器 → Windows 凭据」
- Linux:用
secret-tool lookup或 Seahorse 图形应用
写入流程
当你在 OpenLess 设置界面里首次填入某个凭据时:
- OpenLess 把凭据内容传给 Core 层的凭据管理模块
- Core 层调用 Host(Tauri / egui)提供的系统级安全存储 API
- API 把凭据加密写入系统安全存储
- Core 层拿到写入成功的确认后,丢弃内存中的凭据明文
- 不会生成任何 JSON 或其他明文配置文件
读取流程
每次 OpenLess 需要调用 ASR 或 LLM API 时:
- Core 层调用系统安全存储 API 按 service/label 查找并解密凭据
- 凭据明文被加载到内存中,用于组装请求
- 请求完成后内存中的凭据被丢弃
- 凭据明文在任何时候都不会写到磁盘
旧版本明文 JSON 的迁移
OpenLess v1.x 的早期版本曾经用明文 JSON 存储凭据(~/.openless/credentials.json macOS/Linux、%APPDATA%\OpenLess\credentials.json Windows)。v1.3 之后全面迁移到系统安全存储。
迁移行为是自动的:
- 新版本首次启动时,Core 层会检查旧的明文 JSON 是否存在
- 如果存在,读取 JSON 内容 → 写入系统安全存储 → 删除旧 JSON 文件
- 后续写入/读取全部走系统安全存储
迁移后你可以手动确认旧 JSON 文件已经被删除。如果旧 JSON 还在,说明迁移过程没完成——OpenLess 只会在成功写入系统安全存储后才删除旧文件。
Linux keyring 的前提条件
Linux 上 OpenLess 用系统 keyring。不同发行版配置不同:
| 发行版 | keyring 实现 | 说明 |
|---|---|---|
| GNOME(Ubuntu / Fedora Workstation) | libsecret + gnome-keyring | 默认装好了,开箱能用 |
| KDE Plasma | KWallet | 需要确保 OpenLess 可以访问 KWallet(通常第一次使用时 KDE 会弹窗问你) |
| 纯命令行 / 无桌面 | 建议用 secret-tool 或安装轻量 keyring |
如果 Linux keyring 不可用,OpenLess 会提示你——不会静默降级到明文存储。这是硬保护:没有安全存储就不存凭据。
凭证存储的日志隔离
OpenLess 的日志里永远不会包含凭据明文——哪怕配置了 debug 日志级别。日志里只会显示:
- 凭据是否已配置(✓ / ✗)
- 凭据写入/读取是否成功(成功 / 失败)
- 渠道验证结果
不会泄露任何 API Key 的前缀、哈希、或中间字符。