Search 浏览器如何安全存储密码?macOS 钥匙串与 Passkeys 机制完整解析
【免费下载链接】SearchA small, fast WebKit browser for macOS, by Office Commun.项目地址: https://gitcode.com/gh_mirrors/search59/Search
Search是一款由 Office Commun 打造的 macOS 轻量 WebKit 浏览器(约 3 MB、免费、需 macOS 14+),它的核心卖点之一就是把密码存储交给系统:所有账号密码写入 macOS 登录钥匙串,支持 Passkeys 无密码登录,并可从 Chrome 等浏览器一键导入。这篇文章带你完整看懂它的钥匙串与 Passkeys 安全机制。
密码存在哪里:macOS 登录钥匙串
很多浏览器把密码存在自己的数据库文件里,而 Search 选择了与 Safari 同一套"保险柜"——macOS 钥匙串(Keychain)。
具体规则写在 Vault.swift 的注释里:
- 每条密码是一条互联网密码项(
kSecClassInternetPassword),按"网站 + 账号"索引; - 所有条目打上
Search标签,只属于 Search 自己,不会与 git 令牌等其他应用的同名条目互相覆盖(见 Vault.swift 的写入逻辑); - 加密由系统完成,任何形式都不会落盘到别处,也从不写日志;
- 条目权限设为"解锁时可访问"(
kSecAttrAccessibleWhenUnlocked),读取方只能是签名自 Office Commun 的 Search,其他应用碰一下就会触发系统的授权弹窗。
简单说:密码的保管人是你的 Mac,不是浏览器厂商。Search 没有服务器、没有云同步(README.md 的隐私表 写得明明白白),历史记录等也只是本地 JSON 小文件。
保存与自动填充:克制的密码流程
Search 对密码的态度可以概括为"只在你确认的情况下动手":
- 先成功、再询问。只有当一次登录真正生效后,Search 才会弹窗询问是否保存(见 README.md 中 "Passwords, in your keychain" 一节)。
- 按"站点"而非"主机"匹配。你在
example.com保存的密码,在accounts.example.com也能被找到——它用可注册域名做匹配(Vault.swift 的跨子域查找),并记录最近使用时间,常用账号排在最前。 - 明文 HTTP 页面不喂密码。从普通 http 页面保存的密码会被单独标记(
clear字段),Search 绝不会把它交给任何可能被中间人篡改的页面(Login 结构定义)。 - 查看必须过生物识别。在密码面板(
⌥⌘L)里点"显示",会先调用 Touch ID / Apple Watch / 系统密码验证(Vault.prove 实现);密码明文只显示15 秒后自动打码(Passwords.swift 的揭示逻辑)。
Passkeys 机制:为什么 Search 要亲自接管
Passkeys(无密码密钥)是 WebAuthn 标准:用 Touch ID、iCloud 钥匙串或安全密钥登录,密码本身不存在浏览器里。
这里有个技术细节值得新手了解:Apple 把 Passkeys 的浏览器权限作为受限 entitlement发放,需要专用签名才能启用。Search 的发布构建携带了对应的 Search.passkeys.entitlements,其中com.apple.developer.web-browser.public-key-credential一项就是关键。
由于 WebKit 对"条件中介"(在用户名输入框下自动推荐 Passkey)存在一个已知的卡死缺陷(Passkeys.swift 开头的注释 记录了排查过程),Search 像 Mac 上的 Chrome 和 Firefox 一样自己接管了整个 Passkeys 流程:从页面接收请求 → 校验 → 交给系统 AuthenticationServices → 把结果回传给页面。
发起 Passkeys 请求前的五道安全校验
在 Passkeys.perform 方法 中,任何请求都要先过这五关:
| 校验 | 拦截的风险 |
|---|---|
| 必须是 https 页面(localhost 除外) | 中间人监听 |
| 窗口必须处于前台聚焦 | 后台标签页偷偷弹系统验证面板 |
| 只允许主框架或同站 iframe | 第三方嵌入内容冒充站点发起请求 |
| Relying Party 域名必须是页面的可注册域名或其上级 | 用com、github.io这类任何人都能注册的公共后缀套取密钥 |
| 必须携带非空 challenge | 伪造/重放请求 |
其中"公共后缀"判断直接复用了 macOS 系统自带的域名列表(Passkeys.fits 实现),确保bbc.co.uk这类复杂域名也能正确处理。
用户侧体验
一切校验通过后,弹出的是macOS 自己的 Passkeys 面板:Touch ID 验证、iCloud 钥匙串里的 Passkey、附近 iPhone 扫码,或插入 USB/NFC 安全密钥,任选其一。设置中可随时关闭 Passkeys 推荐(Prefs.swift);如果装了 1Password、Bitwarden 等密码管理扩展,它们优先应答 Passkeys 请求,Search 会把浏览器侧的通道让给扩展(Forms.swift 的说明)。
从其他浏览器一键导入
迁移不需要导出 CSV 再手动粘贴。在密码面板底部(PasswordsPanel 的导入区)直接点 Chrome、Arc、Dia、Brave 或 Edge 的按钮:
- 读取源浏览器本地存储的密码(系统会请求一次源浏览器的钥匙串密钥,不改动原数据);
- 所有条目直接进入你自己的钥匙串、归在 Search 名下;
- 也可以选择 CSV 文件导入,文件读完即止,Search 不保留副本(Vault.take 实现)。
整个过程不出本机——这也是 Search 的隐私底线:没有账号、没有云、没有遥测(README.md)。
快速上手清单 📋
| 操作 | 方法 |
|---|---|
| 打开密码管理面板 | ⌥⌘L |
| 显示某个密码 | 先过 Touch ID,15 秒后自动隐藏 |
| 关闭 Passkeys 推荐 | 设置 › Passwords |
| 检查 Passkeys 系统授权 | 系统设置 › 隐私与安全性 |
| 发现安全漏洞 | 按 SECURITY.md 私有渠道上报 |
小结
Search 的密码安全设计可以总结为三句话:存储上交给系统钥匙串(加密、权限隔离、生物识别验证),流程上保持克制(登录成功才询问、http 页面不喂密码、明文限时展示),Passkeys 上主动加固(五重校验 + 系统原生面板)。代码只有约一万两千行且单文件单职责,想核对任何一个结论,直接读 Sources/Search/ 里的 Vault.swift 和 Passkeys.swift 即可。
【免费下载链接】SearchA small, fast WebKit browser for macOS, by Office Commun.项目地址: https://gitcode.com/gh_mirrors/search59/Search
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考