Sincronização segura das chaves
Quando um usuário ativa as Chaves do iCloud pela primeira vez, o dispositivo estabelece um círculo de confiança e cria uma identidade de sincronização para si. A identidade de sincronização consiste em uma chave privada e uma chave pública, sendo armazenada nas chaves do dispositivo. A chave pública da identidade de sincronização é colocada no círculo e o círculo é assinado duas vezes: primeiro pela chave privada da identidade de sincronização e depois por uma chave elíptica assimétrica (usando P-256) derivada da senha da conta do iCloud do usuário. Também armazenados no círculo estão os parâmetros (sal aleatório e iterações) usados para criar a chave baseada na senha do iCloud do usuário.
No caso de contas com autenticação de dois fatores, outro círculo de sincronização semelhante é criado e armazenado no CloudKit. As identidades de dispositivos nesse sistema consistem em dois pares de chaves elípticas assimétricas (usando P-384), que também são armazenadas nas chaves. Cada dispositivo mantém sua própria lista de identidades confiáveis e assina essa lista usando uma de suas chaves de identidade.
Armazenamento do círculo de sincronização no iCloud
O círculo de sincronização assinado é armazenado na área de armazenamento de valores de chaves do iCloud do usuário. Ele não pode ser lido sem o conhecimento da senha do iCloud do usuário nem pode ser modificado legalmente sem a chave privada da identidade de sincronização do seu integrante.
No caso de contas com autenticação de dois fatores, a lista de sincronização de cada dispositivo é armazenada no CloudKit. As listas não podem ser lidas sem o conhecimento da senha do iCloud do usuário nem podem ser modificadas sem as chaves privadas do dispositivo que as possui.
Como outros dispositivos de um usuário são adicionados ao círculo de sincronização
Novos dispositivos, ao iniciarem sessão no iCloud, passam a integrar o círculo de sincronização das Chaves do iCloud de uma entre duas formas possíveis: ou se emparelhando e sendo patrocinados por um dispositivo existente das Chaves do iCloud, ou por meio da recuperação das Chaves do iCloud.
Durante os fluxos de emparelhamento, o dispositivo solicitante cria novas identidades de sincronização tanto para o círculo de sincronização quanto para as listas de sincronização (no caso de contas com autenticação de dois fatores) e as apresenta ao patrocinador. O patrocinador adiciona a chave pública do novo integrante ao círculo de sincronização e a assina novamente com a identidade de sincronização e a chave derivada da senha do iCloud do usuário. O novo círculo de sincronização é colocado no iCloud, onde é assinado pelo novo integrante do círculo de maneira semelhante. Em contas com autenticação de dois fatores, o dispositivo patrocinador também fornece ao novo dispositivo um voucher assinado por suas chaves de identidade, mostrando que o dispositivo solicitante deve ser confiável. Em seguida ele atualiza sua lista de identidades de sincronização confiáveis para incluir o solicitante.
Agora há dois integrantes no círculo de sincronização e cada integrante possui a chave pública do outro dispositivo. Eles começam a trocar itens individuais das chaves através do armazenamento de valores de chaves do iCloud ou os armazenam no CloudKit, seja qual for o mais apropriado à situação. Se os dois integrantes do círculo tiverem atualizações para o mesmo item, uma ou outra é escolhida, resultando em consistência. Cada item sincronizado é criptografado, de modo que possa ser descriptografado somente por um dispositivo dentro do círculo de confiança do usuário; ele não pode ser descriptografado por nenhum outro dispositivo ou pela Apple.
Conforme novos dispositivos passam a integrar o círculo de sincronização, esse “processo de integração” é repetido. Por exemplo, quando um terceiro dispositivo se junta, ele pode ser emparelhado com qualquer um dos dispositivos atuais. Conforme novos dispositivos são adicionados, cada um é sincronizado ao novo. Isso é projetado para garantir que todos os integrantes tenham os mesmos itens das chaves.
Apenas certos itens são sincronizados
Alguns itens das chaves são específicos de um dispositivo, como as chaves do iMessage, e portanto devem permanecer no dispositivo. Dessa forma, todo item a ser sincronizado deve ser marcado explicitamente com o atributo kSecAttrSynchronizable
.
A Apple define esse atributo para os dados de usuário do Safari (incluindo nomes de usuários, senhas e números de cartão de crédito), além de senhas de Wi-Fi, chaves de criptografia do HomeKit e outros itens das chaves compatíveis com criptografia de ponta a ponta do iCloud.
Além disso, os itens das chaves adicionados por apps de terceiros não são sincronizados por padrão. Os desenvolvedores devem definir o atributo kSecAttrSynchronizable
ao adicionar itens às chaves.