Безопасная синхронизация связки ключей
Когда пользователь впервые включает Связку ключей iCloud, устройство устанавливает круг доверия и создает для себя идентификатор синхронизации. Этот идентификатор синхронизации, состоящий из личного ключа и открытого ключа, хранится в связке ключей на устройстве. Открытый ключ идентификатора синхронизации помещается в круг, а сам круг подписывается дважды: в первый раз с помощью личного ключа идентификатора синхронизации, а во второй раз с помощью асимметричного эллиптического ключа (на основе P-256), полученного из пароля учетной записи iCloud пользователя. Вместе с кругом сохраняются параметры (случайное значение «соли» и число повторений), использованные для создания ключа из пароля учетной записи iCloud пользователя.
В случае учетных записей с двухфакторной аутентификацией создается дополнительный круг синхронизации, который сохраняется в CloudKit. Идентификаторы устройства в этой системе состоят из двух пар асимметричных эллиптических ключей (с использованием P-384), также сохраняемых в связке ключей. Каждое устройство ведет свой список доверенных идентификаторов и подписывает его одним из своих ключей идентификации.
Хранилище iCloud для круга синхронизации
Подписанный круг синхронизации хранится в хранилище типа ключ-значение в учетной записи iCloud пользователя. Его нельзя прочитать без пароля iCloud пользователя и нельзя изменить, не имея личного ключа идентификатора синхронизации одного из членов круга.
В случае учетных записей с двухфакторной аутентификацией список синхронизаций каждого устройства хранится в CloudKit. Эти списки устройств нельзя прочитать без пароля iCloud пользователя и нельзя изменить, не имея личных ключей владеющего устройства.
Порядок добавления других устройств пользователя в круг синхронизации
После входа в iCloud новые устройства добавляются в круг синхронизации связки ключей iCloud одним из двух способов: либо создав пару с зарегистрированным в iCloud устройством, с которого одобрено это новое устройство, либо используя восстановление Связки ключей iCloud.
Во время создания пары запрашивающее устройство создает новые идентификаторы синхронизации одновременно для круга синхронизации и списков синхронизации (в случае учетных записей с двухфакторной аутентификацией) и передает их одобрившему устройству. Одобрившее устройство добавляет в круг синхронизации открытый ключ нового члена и подписывает его еще раз с помощью своего идентификатора синхронизации и ключа, полученного из пароля iCloud пользователя. Новый круг синхронизации передается в iCloud, где его аналогичным образом подписывает новый член круга. В случае учетных записей с двухфакторной аутентификацией одобрившее устройство также предоставляет присоединяющемуся устройству ваучер, подписанный ключами идентификации одобрившего устройства, подтверждая, что присоединяющемуся устройству можно доверять. Затем это устройство обновляет свой отдельный список доверенных идентификаторов синхронизации, чтобы включить в него присоединяющееся устройство.
Теперь в круг входят два члена, и у каждого из них есть открытый ключ другого члена. Члены круга начинают обмениваться индивидуальными элементами связки ключей через хранилище iCloud типа ключ-значение или сохраняют эти элементы в CloudKit, что зависит от ситуации. Если оба члена круга хотят изменить один и тот же элемент, выбирается один или другой, чтобы остался только один элемент. Каждый синхронизируемый элемент шифруется таким образом, что его может расшифровать только устройство из круга доверия пользователя. Он не может быть расшифрован любыми другими устройствами или компанией Apple.
Когда к кругу присоединяются новые устройства, вся процедура повторяется. Например, при присоединении третьего устройства его можно объединить в пару с одним из других устройств пользователя. При добавлении нового члена круга выполняется его синхронизация с другими членами круга. Эта мера направлена на то, чтобы на всех устройствах хранились одинаковые элементы связки ключей.
Синхронизируются только определенные элементы
Некоторые элементы связки ключей, такие как ключи iMessage, относятся к конкретному устройству, поэтому они должны оставаться на устройстве. Поэтому каждый синхронизируемый объект должен быть явно обозначен атрибутом kSecAttrSynchronizable
.
Apple устанавливает этот атрибут для пользовательских данных Safari (включая имена пользователей, пароли и номера кредитных карт), а также для паролей сетей Wi-Fi, ключей шифрования HomeKit и других элементов связки ключей, поддерживающих сквозное шифрование iCloud.
Кроме того, по умолчанию в синхронизации не участвуют элементы связки ключей, добавленные приложениями сторонних разработчиков. При добавлении элементов в связку ключей разработчики должны установить атрибут kSecAttrSynchronizable
.