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