
Безопасное отображение имени и фото пользователя iMessage для других пользователей
Пользователь может поделиться своим именем и фотографией в iMessage. Пользователь может выбрать информацию из своей карточки («Моя карточка») или изменить имя и добавить произвольное изображение. Если пользователь делится именем и фото в iMessage, используется двухэтапная система передачи имени и фотографии.
Данные разбиваются на поля, каждое из которых шифруется и аутентифицируется отдельно, а также аутентифицируется совместно с другими в соответствии с описанным ниже процессом. Имеется три поля:
имя;
фотография;
имя файла фотографии.
На одном из первых шагов создания данных на устройстве генерируется случайный 128-битный ключ записи. Затем к этому ключу записи применяется HKDF-HMAC-SHA-256 для создания трех производных подключей: Key 1:Key 2:Key 3 = HKDF(record key, “nicknames”). Для каждого поля генерируется случайный 96-битный вектор инициализации, затем выполняется шифрование данных с помощью AES-CTR и ключа Key 1. После этого по алгоритму HMAC-SHA-256 с использованием ключа Key 2 вычисляется код аутентификации сообщения (MAC), включая имя поля, вектор инициализации поля и зашифрованный текст поля. Наконец, выполняется объединение набора значений MAC отдельных полей, и для них вычисляется значение MAC по алгоритму HMAC-SHA-256 с использованием ключа Key 3. 256-битное значение MAC хранится вместе с зашифрованными данными. Первые 128 бит значения MAC используются в качестве идентификатора записи.
Затем эта зашифрованная запись сохраняется в открытой базе данных CloudKit под идентификатором записи. Эта запись никогда не подвергается изменениям. Когда пользователь решает изменить свои имя и фотографию, каждый раз создается новая зашифрованная запись. Когда пользователь 1 решает поделиться своим именем и фото с пользователем 2, он отправляет ключ записи вместе с идентификатором RecordID внутри своей полезной нагрузки iMessage, которая зашифрована.
Когда устройство пользователя 2 получает эту полезную нагрузку iMessage, оно замечает, что сообщение содержит RecordID никнейма и фото, а также ключ. Затем устройство пользователя 2 обращается к открытой базе данных CloudKit, чтобы получить зашифрованное имя и фотографию по идентификатору записи, и отправляет их в iMessage.
После извлечения сообщения устройство пользователя 2 расшифровывает полезную нагрузку и проверяет подпись, используя RecordID. В случае успешной проверки пользователь 2 видит имя и фотографию и может добавить их в свои контакты или использовать в Сообщениях.