拆解Proton Pass安全中心:如何检测密码复用、弱密码与泄露风险的4步引擎
拆解Proton Pass安全中心:如何检测密码复用、弱密码与泄露风险的4步引擎
【免费下载链接】android-passAndroid code for the Proton Pass application项目地址: https://gitcode.com/gh_mirrors/an/android-pass
Proton Pass 是一款开源的 Android 密码管理应用,其内置的**安全中心(Security Center)**会自动扫描你的密码库,检测密码复用、弱密码、缺失双因素认证(2FA)与数据泄露风险。本文带你拆解这个检测引擎的 4 个核心步骤:从采集密码库数据,到逐条评分打分,最后汇总成一份安全分析报告。
安全中心源码在哪里
整个功能拆成两个 Gradle 模块,职责清晰:
- 检测引擎(
pass/security-center/):接口定义在 api 模块,具体检测器实现在 impl 模块,还配有 fakes 模块 供单元测试使用; - 界面层(
pass/features/security-center/):包含首页、报告、复用密码、弱密码、缺失 2FA、暗网监控等多个 Compose 页面。
4 步引擎总览如下:
| 步骤 | 检测器 | 负责发现 |
|---|---|---|
| 第 1 步 | ObserveSecurityAnalysisImpl | 采集监控条目,同步泄露情报 |
| 第 2 步 | RepeatedPasswordChecker | 🔁 密码复用 |
| 第 3 步 | InsecurePasswordChecker | 🔒 弱密码 / 易猜密码 |
| 第 4 步 | MissingTfaChecker+ 泄露密码源 | ⚠️ 未开 2FA、已泄露密码 |
第 1 步:采集密码库数据,同步泄露情报
一切从 ObserveSecurityAnalysisImpl.kt 开始。它做两件事:
- 取数据:通过
observeMonitoredItems(includeHiddenVaults = false)订阅所有受监控的密码条目(隐藏库不参与检测); - 刷新情报:每次条目变化时触发
refreshCompromisedPasswords(items),把当前密码与已知的泄露密码数据比对更新。
之后用 Kotlin Flow 的combine把 4 个检测器与泄露密码流并行合并成一份SecurityAnalysis结果。每个检测都包装成带加载态的LoadingResult,所以界面上每一项数字都会先显示"加载中"再变为真实计数。
第 2 步:密码复用检测——一个密码用在了几个网站
实现见 RepeatedPasswordChecker.kt,算法非常直白:
- 过滤掉用户手动排除检测的条目(
isCheckExcluded(SecurityCheck.ReusedPassword)); - 在加密上下文中逐条解密登录密码,以明文密码作为 Key 建一张
Map<密码, 条目列表>; - 任何 Key 对应的条目数大于 1,这个密码就算"被复用",整组条目进入报告。
值得注意的细节:报告里存的是重新加密后的密码,明文只在内存中短暂存在——密码永远不会以明文落盘或外传。
第 3 步:弱密码评分——让 Rust 引擎给密码打分
弱密码判定在 InsecurePasswordChecker.kt:对每条登录密码调用PasswordScorer,该评分器由 Rust 核心提供(见 PasswordScorerImpl.kt),输出三档结果:
- VULNERABLE(易攻破):直接进入高危列表;
- WEAK(弱):进入弱密码列表;
- STRONG(强):不报告。
用 Rust 做评分意味着检测逻辑跨平台共享、性能稳定,且评分规则与桌面端、Web 端保持完全一致。
第 4 步:2FA 缺失与泄露密码检查
Missing2faChecker.kt 的判定逻辑是"5 个条件全满足才报警":
- 条目没有被用户排除 2FA 检查;
- 条目没有绑定 Passkey(有 Passkey 视为已有更强的第二因子);
- 是登录类型条目;
- 没有设置 TOTP 验证码;
- 该网站确实支持2FA——通过域名白名单
Supports2fa判断,避免给不支持的网站报"误伤"。
同时,第 1 步刷新的泄露密码流(observeCompromisedPasswords)会持续统计有多少密码已出现在已知泄露数据中,与暗网监控(Sentinel)功能共同构成泄露风险检测。
结果如何呈现,用户能做什么
最终 5 路数据流被combine汇总为SecurityAnalysis,经distinctUntilChanged()去重后驱动界面。报告页 UI 见 SecurityCenterReportContent.kt,支持把条目"标记为已解决"。
用户也可以精细控制检测范围。SecurityCheck.kt 定义了 4 类检查(弱密码、泄露密码、复用密码、缺失 2FA),每条密码都能单独跳过其中任意一项检查——比如某个内部系统必须用弱密码,就不必让它反复报警。
小结
🔐 Proton Pass 安全中心的设计思路可以概括为一句话:"本地解密评分 + 远端泄露情报 + 白名单降噪"。4 步引擎全部跑在端侧,密码不离开加密边界;配合可排除机制与分档评分,让新手也能看懂"为什么这条密码有风险",并知道下一步该改什么。
【免费下载链接】android-passAndroid code for the Proton Pass application项目地址: https://gitcode.com/gh_mirrors/an/android-pass
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
