钥匙串安全同步
当用户首次在双重认证账户上打开 iCloud 钥匙串时,设备将建立并为自己创建同步身份。同步身份包括非对称椭圆密钥(使用 P-384),且储存在设备的钥匙串中。每台设备均维护包含用户其他设备同步身份的本机列表,且使用其中一个身份密钥为此列表签名。这些列表储存在 CloudKit 中,以让用户的设备在相互之间安全同步钥匙串数据上达成一致。
为了兼容较旧的 iCloud 设备,设备将创建类似的同步信任圈并建立其他同步身份。同步身份的公钥放置在信任圈中,该信任圈已签名两次:第一次由同步身份的私钥签署,第⼆次由来自用户 iCloud 账户密码的非对称椭圆密钥(使用 P-256)签署。随信任圈一起储存的还有参数(随机盐和迭代次数),用于创建基于用户 iCloud 密码的密钥。
iCloud 储存同步信任圈
对于双重认证的账户,每台设备的受信任设备列表会储存在 CloudKit 中。如果不知道用户的 iCloud 密码,就无法读取列表;如果没有已拥有设备的私钥,就无法修改私钥。
同样,签名的同步信任圈储存在用户的 iCloud 键值存储区域,如果不知道用户的 iCloud 密码,就无法对其进行读取,而且如果没有信任圈成员同步身份的私钥,就无法对其进行有效地修改。
用户的其他设备如何添加到同步信任圈
新设备登录 iCloud 时,可通过这两种方式之一加入 iCloud 钥匙串同步信任圈:与现有的 iCloud 钥匙串设备配对并获得其担保,或者使用 iCloud 钥匙串恢复。
在配对流程中,申请设备为同步信任圈和同步列表(针对双重认证账户)新建同步身份,并将其出示给担保设备。担保设备将新成员的公钥添加至同步信任圈,并且使用其同步身份和派生自用户 iCloud 密码的密钥再次签名。新的同步信任圈放置在 iCloud 中,该信任圈的新成员也是在此处对其进行签名。在双重认证账户中,担保设备还为加入设备提供使用其身份密钥签名的凭证,表明申请设备应被信任。然后,它会更新其受信任同步身份的单独列表,以包括申请设备。
现在,签名信任圈有两个成员,并且每个成员拥有另一个成员的公钥。它们现在开始通过 CloudKit 或 iCloud 键值存储(视情境而定)交换各个钥匙串项。如果两个信任圈成员都更新了相同的项目,其中一个会被选中,最终获得一致的结果。每个同步的项目都会加密,使只有用户信任圈内的设备才能解密,任何其他设备或 Apple 都无法解密。
新设备加入同步信任圈时会重复此“加入流程”。例如,第三台设备加入时,可与其中任一台现有设备进行配对。随着新的同级设备加入,每台同级设备均与新设备进行同步。此设计旨在确保所有成员拥有相同的钥匙串项。
仅同步部分项目
部分钥匙串项特定于设备,如 iMessage 信息密钥,因而必须保留在设备上。若要防止意外传输数据,每个将要同步的项目都必须使用 kSecAttrSynchronizable
属性明确标记。
Apple 为 Safari 浏览器用户数据(包括用户名、密码和信用卡号)、无线局域网密码、HomeKit 加密密钥以及其他支持端对端 iCloud 加密的钥匙串项设置了该属性。
另外,在默认情况下,第三方 App 添加的钥匙串项不会进行同步。将项目添加至钥匙串时,开发者必须设置 kSecAttrSynchronizable
属性。