完整解析Proton Pass的Passkeys三大核心流程:Android端WebAuthn密钥生成与认证指南

📅 2026/8/24 17:51:43
完整解析Proton Pass的Passkeys三大核心流程:Android端WebAuthn密钥生成与认证指南
完整解析Proton Pass的Passkeys三大核心流程Android端WebAuthn密钥生成与认证指南【免费下载链接】android-passAndroid code for the Proton Pass application项目地址: https://gitcode.com/gh_mirrors/an/android-passProton Pass是 Proton 推出的开源密码管理器其 Android 客户端的Passkeys通行密钥功能基于WebAuthn标准实现。本文将带你深入 Android 端源码完整解析 Passkey 从设备兼容性检查、密钥生成到认证响应的全流程实现帮助你快速理解无密码登录背后的技术细节。 模块架构api / impl / fakes 三层分离Passkeys 功能被独立封装在专门的模块中遵循项目统一的「接口 实现 假实现」分层设计模块路径职责API 接口层pass/passkeys/api/定义GeneratePasskey、AuthenticateWithPasskey、CanDeviceSupportPasskeys、ParseCreatePasskeyRequest四个核心接口实现层pass/passkeys/impl/真正的业务逻辑全部委托给 Rust 核心库完成假实现层pass/passkeys/fakes/提供 Fake 实现用于单元测试与截图测试UI 层pass/features/passkeys/Passkey 选择底部弹窗SelectPasskeyBottomsheet这种设计的妙处在于Kotlin 层只负责胶水工作所有密码学计算都下沉到 Rust 侧的PasskeyManager通过pass/common-rust/模块以 FFI 方式接入保证了跨平台一致性与加密安全性。依赖注入的组装逻辑在pass/passkeys/impl/src/main/kotlin/proton/android/pass/passkeys/impl/PasskeyModule.kt中其中RustPasskeyManager会在创建时注册 WebAuthn 网络请求获取器把 Kotlin 侧的 HTTP 能力注入给 Rust 核心。 第 1 步设备兼容性检查——不是所有手机都能用并非所有 Android 设备都支持 Passkey。CanDeviceSupportPasskeysImpl.kt位于pass/passkeys/impl/src/main/kotlin/proton/android/pass/passkeys/impl/中的判断逻辑非常直接Quest 版VR 设备直接判定为不支持Android 版本低于 14UPSIDE_DOWN_CAKE不支持因为系统的 Credential Manager API 从 Android 14 才开始提供 Passkey 支持满足以上条件还会尝试创建CredentialManager实例并记录诊断日志确认设备能力。新手提示这就是为什么你的旧手机上可能看不到 Passkey 选项——系统版本是第一道门槛。 第 2 步WebAuthn 密钥生成注册流程当你在支持 Passkey 的网站或 Proton 服务点击「创建通行密钥」时浏览器会发起一个registration 请求JSON 格式。GeneratePasskeyImpl.kt是这条链路的入口流程如下浏览器 registration 请求 │ ▼ ① PasskeyJsonSanitizer.sanitize() ← 清洗网站发来的脏数据 │ ▼ ② Rust PasskeyManager.generatePasskey(url, sanitized) │ ▼ ③ GetPasskeyCreationData ← 记录在哪台设备上创建 │ ▼ ④ 封装为 Passkey 领域对象 返回给浏览器的 response几个值得注意的设计点创建元数据留痕GetPasskeyCreationDataImpl.kt会把创建时的操作系统Android、系统版本、设备型号如 Xiaomi 14和应用版本记录到 Passkey 上方便日后排查问题返回双份数据GeneratedPasskey同时包含passkey存入 Proton Pass 加密库的凭据实体和response回传给浏览器的认证响应 JSON一个流程兼顾入库和应答两件事ParseCreatePasskeyRequestImpl.kt则负责在展示 UI 前解析请求提前提取rpId服务域名、rpName、userName等信息用于在界面上显示正在为某某网站创建 Passkey。️ 第 3 步Passkey 认证登录流程登录时浏览器发来authentication 请求由AuthenticateWithPasskeyImpl.kt处理先用同一个PasskeyJsonSanitizer清洗请求 JSON组装AuthenticateWithPasskeyAndroidRequest包含 origin、请求体、凭据内容和clientDataHash调用 Rust 侧resolveChallengeForAndroid()完成挑战应答——私钥解密签名全程在 Rust 核心中完成Kotlin 层接触不到明文密钥成功后返回PasskeyAuthenticationResponse其response字段交给浏览器完成登录。失败处理也体现了工程严谨性异常时会提取请求中的rpId和allowCredentials数量写入日志rpId 做了脱敏但不会泄露任何凭据材料方便定位是哪个网站的请求出了问题。 工程细节JSON 消毒器与 Related Origins 获取① 站点特判消毒PasskeyJsonSanitizer.kt内置了一组网站特例修正器处理真实世界中的脏数据PayPaltimeout字段发来浮点数需转为整数eBayalg算法值发成字符串且带规格未定义的-1需转数字并剔除通用号被转义成\u003d需还原。这个小文件生动说明对接真实 Web 生态时协议规范与站点实际行为之间的缝隙正是客户端要填的坑。② 安全抓取 Related OriginsWebauthnRelatedOriginsFetcher.kt实现了 Rust 核心需要的网络回调拉取网站的/.well-known/web-authn/related-origins文档允许跨域创建 Passkey 的来源清单并做了三重防护仅允许 HTTPS、响应体上限 512KB、404 等错误分类抛出防止恶意站点通过伪造文档诱导用户创建 Passkey。 UI 层一键选择 Passkey当系统提示选择通行密钥时用户看到的是pass/features/passkeys/src/main/kotlin/proton/android/pass/features/passkeys/select/ui/bottomsheet/SelectPasskeyBottomsheet.kt实现的底部弹窗——它从 Proton Pass 加密库中读取匹配该域名的 Passkey 列表供用户选择选择后经上述认证流程完成登录全程支持指纹/面部等生物识别。 总结一条链路串起的完整闭环阶段关键文件核心动作兼容性检查CanDeviceSupportPasskeysImpl.ktAndroid 14、非 Quest请求解析ParseCreatePasskeyRequestImpl.kt提取域名与账户信息密钥生成GeneratePasskeyImpl.ktRust 侧生成密钥对并入库认证应答AuthenticateWithPasskeyImpl.ktRust 侧签名挑战Kotlin 只传数据安全防护PasskeyJsonSanitizer.ktWebauthnRelatedOriginsFetcher.kt数据清洗 HTTPS 强制Proton Pass 的 Passkey 实现给出了一个值得借鉴的范本Kotlin 负责界面与流程编排Rust 负责密码学核心接口层负责解耦与可测试性——三层各司其职让无密码登录既安全又易于维护。 【免费下载链接】android-passAndroid code for the Proton Pass application项目地址: https://gitcode.com/gh_mirrors/an/android-pass创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考