密码监视
“密码监视”功能是将储存在用户“自动填充密码”钥匙串中的密码与已知在不同在线组织的密码泄露中出现过的密码列表进行对比,该列表将持续更新并精选。如果打开了该功能,监视协议会持续将用户“自动填充密码”钥匙串中的密码与该精选列表进行对比。
监视的工作方式
用户的设备会持续轮替检查用户的密码,查询间隔不受用户密码或密码管理器使用模式影响,从而帮助确保验证状态与当前已泄露密码的精选列表保持同步更新。为了帮助防止泄露用户拥有多少个唯一密码的相关信息,查询请求会进行批处理且并行执行。每次检查时会并行验证固定数量的密码,如果用户拥有的密码数量少于此数量,则会生成随机密码并添加到查询以补齐数量差。
密码如何匹配
密码分为两个阶段进行匹配。最常见的泄露密码包含在用户设备上的本地列表中。如果用户的密码包含在此列表中,用户会立即收到通知,无需执行任何外部交互。此设计旨在确保用户所拥有的这类在数据泄露中风险最高的密码的任何相关信息不会遭到泄露。
如果密码未包含在最常见的泄露密码列表中,那么会在不常见的泄露密码列表中进行对比。
将用户密码与精选列表对比
验证密码是否包含在本地列表中的这个对比过程涉及一些与 Apple 服务器的交互。为了帮助确保合法用户的密码不会发送给 Apple,对比过程采用了加密隐私保护集合交集这种形式,即将用户的密码与大型泄露密码集进行对比。这样做旨在确保只会与 Apple 共享泄露风险较小的密码的少量信息,对于用户密码,此信息仅限于加密哈希值的 15 位前缀。从这个交互过程中移除最常见的泄露密码使用的是最常见泄露密码的本地列表,由此减少了使用网络服务时密码在存储桶中出现的相对频率的增量,从而使用户密码无法从这些查询中推算出来。
基础协议会将精选密码列表(编写本文时包含约 15 亿个密码)细分为 215 个不同的存储桶。密码所属的存储桶取决于密码 SHA256 哈希值的前 15 位。此外,每个泄露的密码 pw 与 NIST P256 曲线上的一个椭圆曲线点相关联:Ppw = ⍺·HSWU(pw),其中 ⍺ 是仅为 Apple 所知的随机密钥,而 HSWU 是一个随机 Oracle 函数,它会将密码映射到基于 Shallue-van de Woestijne-Ulas 方法的曲线点。此转换过程旨在通过计算方法隐藏密码的值并帮助防止通过“密码监视”透露最新泄露的密码。
为了计算隐私保护集合交集,用户密码所属的存储桶由用户的设备使用 λ(即 SHA256(upw) 的 15 位前缀)来确定,其中 upw 是用户的密码之一。设备生成自己的随机常量 β 并将点 Pc = β·HSWU(upw) 连同与 λ 对应的存储桶查询请求发送到服务器。其中 β 会隐藏用户密码相关的信息并限制 λ 透露密码中的信息给 Apple。最终服务器会收到用户设备发送的点,计算 ⍺Pc = ⍺β·HSWU(upw),并向设备返回计算结果以及点 Bλ = { Ppw | SHA256(pw) 以前缀 λ 开头} 对应的存储桶。
所返回的信息允许设备计算 B’λ = {β·Ppw | Ppw ∈ Bλ};如果 ⍺Pc ∈ B'λ,则确定用户的密码已经泄露。