Chrome 原生书签足够好用,但一旦把账号密码写进标题,或依赖浏览器账号同步明文凭据,安全边界就比较模糊。为此我做了一个 Manifest V3 扩展:书签管家——在新标签页管理原生书签,并提供标签、密码库,以及向 私人 Gitee / GitHub 仓库 的端到端加密同步。

仓库:https://gitee.com/doautumn/bookmarks(当前 v1.3.1

工作台.png

设计目标

  1. 书签仍使用 Chrome 原生数据:增删改与网页收藏均走系统书签 API,不另建一套书签存储。
  2. 凭据与书签标题分离:账号、密码进入密码库,按 URL 关联,避免写在标题中。
  3. 多机同步仅传输密文:云端为 AES-GCM 载荷(meta.json + payload.enc);主密码经 PBKDF2 派生密钥,不以明文长期落盘。
  4. 兼顾日常效率:登录页自动填充;可选 Touch ID / Windows Hello 解锁。

功能概览

模块 说明
工作台 新标签页时钟、Bing 搜索、最近打开、「常用」侧栏
书签管理 宫格 / 列表、分组树、搜索与标签、批量操作
密码库 按书签 URL 存储账号、密码、备注;支持清理孤儿凭据
自动填充 匹配登录页;唯一命中可静默填充,多账号时提供选择条
云端同步 私人仓库端到端加密;锁定期间禁止上传,避免空密码库覆盖远端
会话锁定 空闲锁定、手动锁定、关闭浏览器后再打开:书签仍可用,凭据需解锁

书签管理.png

安装

  1. 打开 chrome://extensions,开启「开发者模式」
  2. 「加载已解压的扩展程序」,选择仓库根目录
  3. 打开新标签页,或通过工具栏图标进入

首次使用可选:从旧 Gist 迁移、全新初始化、连接已有仓库。Token 建议仅授予该私有仓库所需的最小权限。

同步与锁定

若在锁定状态下仍用空密码库加密上传,会覆盖远端已有数据。当前策略如下:

状态 书签 密码库 / 自动填充 云端上传
已解锁 可用 可用 书签变更防抖上传;支持手动推拉
锁定 / 刚重启浏览器 可用 需先解锁 不上传

锁定期间仍可收藏网页,变更保留在本机 Chrome 书签中。解锁后的同步流程:

  1. 拉取远端密码库与标签(不覆盖本机书签树,避免冲掉锁定期间的本地变更)
  2. 仅当本机书签与远端不一致时上传,减少无意义的仓库提交
  3. 拉取失败时仍会保守上传一次,避免本地积压长期无法上云

空闲锁定由后台 chrome.alarms 约每分钟检查一次;锁定后,其它已打开的扩展页会同步清除内存中的明文凭据。

生物识别与 PRF

启用生物识别后,扩展通过 WebAuthn 平台认证器唤起系统指纹 / Windows Hello 对话框。

网站通行密钥(如 GitHub 登录)与密码库解锁对 WebAuthn 的需求并不相同:

  • 通行密钥登录:完成用户验证即可
  • 密码库解锁:还需要从认证器取得可用于解密封装密钥的材料,依赖 WebAuthn PRF 扩展

部分环境(例如 Chrome 本机档案中的 Touch ID)可以完成指纹验证,但不提供 PRF。因此实现分为两档:

  1. PRF 模式:由认证器派生密钥,包装密码库 AES 密钥
  2. 门控模式:指纹仅作身份验证;包装密钥仍保存在本机扩展存储中。可降低误触解锁的风险,但无法对抗直接读取本机 Chrome 配置目录的攻击面

修改主密码后,生物识别会关闭,需要重新启用。

生物识别.png

安全边界

适用场景:私有仓库 + 可信本机环境,并建议开启系统磁盘加密与自动锁屏。

它不是「整盘失守仍可保全密码库」一类产品;更接近「私人加密备份 + 会话内可用」的书签与凭据工具。

主要约定:

  • 主密码经 PBKDF2 派生,不以明文保存
  • 派生密钥默认仅存在于 chrome.storage.session;关闭浏览器后需重新解锁
  • 本机密码库以密文缓存落盘;云端仅保存加密载荷
  • Token、主密码及解密后的备份均不应提交到 Git
  • 自动填充仍会将密码写入页面 DOM,需接受登录页 XSS 等通用风险
  • 锁定状态下仍可能保留「哪些 URL 存有凭据」一类元数据(用于界面提示)

技术结构

无构建步骤的纯前端扩展。修改代码后,在 chrome://extensions 重新加载扩展,并硬刷新标签页即可。

1
2
3
4
5
6
7
8
9
manifest.json
html/bookmarks.html
styles/app.css
scripts/
app.js # UI
background.js # Service Worker:同步、取密、空闲检查
autofill.js # 内容脚本
biometric.js # WebAuthn 解锁
session / vault / crypto / sync / unlock-flow / …

权限包括:bookmarksstoragetabsalarms,以及对 Gitee / GitHub API 与自动填充页面的主机访问权限。

小结

书签管家优先保证原生书签体验,再在密码库与同步上采用「私有仓库 + 会话锁定」的收口方式。若需要类似能力,可直接从仓库克隆使用或二次修改。

欢迎在仓库提交 Issue;文中截图会在后续补齐。

云端同步.png