Processo di invio e ricezione sicuri dei messaggi con iMessage
Gli utenti avviano una nuova conversazione iMessage inserendo un indirizzo o un nome. Se inseriscono un numero di telefono o un indirizzo e‑mail, il dispositivo contatta Apple Identity Service (IDS) per recuperare le chiavi pubbliche e gli indirizzi APN di tutti i dispositivi associati al destinatario. Se l’utente inserisce un nome, il dispositivo utilizza prima l’app Contatti per ottenere i numeri di telefono e gli indirizzi e‑mail associati al nome, quindi recupera le chiavi pubbliche e gli indirizzi APN dall’IDS.
Il messaggio in uscita viene codificato individualmente per ciascun dispositivo del destinatario. Le chiavi pubbliche di codifica e firma dei dispositivi riceventi vengono recuperate dall’IDS. Per ogni dispositivo di ricezione, il dispositivo di invio genera un valore a 88 bit casuale e lo utilizza come chiave HMAC‑SHA256 per costruire un valore a 40 bit derivato dalla chiave pubblica del mittente e del ricevente, oltre che dal testo. La concatenazione dei valori a 88 e 40 bit crea una chiave a 128 bit, che codifica il messaggio tramite AES in modalità CTR. Il valore a 40 bit è utilizzato dal ricevente per verificare l’integrità del testo decrittografato. Questa chiave AES per messaggio è codificata utilizzando RSA‑OAEP sulla chiave pubblica del dispositivo ricevente. La combinazione tra testo del messaggio codificato e chiave del messaggio codificato viene quindi sottoposta a hashing con SHA‑1; a questo punto, l’hash viene firmato tramite l’algoritmo ECDSA utilizzando la chiave privata per la firma del dispositivo mittente. In iOS 13 o versioni successive e iPadOS 13.1 o versioni successive, i dispositivi possono utilizzare la codifica ECIES al posto della codifica RSA.
I messaggi risultanti, uno per ciascun dispositivo ricevente e contenenti il testo del messaggio codificato, la chiave del messaggio codificato e la firma digitale del mittente, sono quindi inviati al servizio APN per la consegna. I metadati, come l’indicazione di data e ora e le informazioni per l’instradamento via APN, non sono codificati. La comunicazione con il servizio APN è codificata utilizzando un canale TLS forward‑secret.
Il servizio APN può solo inoltrare messaggi di dimensioni fino a 4 KB o 16 KB, a seconda della versione di iOS o iPadOS. Se il messaggio è troppo lungo, o se contiene un allegato come una foto, l’allegato viene codificato utilizzando AES in modalità CTR con una chiave casuale a 256 bit e quindi caricato su iCloud. La chiave AES per l’allegato, il suo Uniform Resource Identifier (URI) e un hash SHA‑1 della sua forma codificata vengono quindi inviati al destinatario come contenuti di un iMessage; la riservatezza e l’integrità dei contenuti sono protette tramite la normale codifica di iMessage, come mostrato nel seguente diagramma.
Per le conversazioni di gruppo, questo processo viene ripetuto per ogni destinatario e per ciascuno dei loro dispositivi.
Sul lato del destinatario, ogni dispositivo riceve la propria copia del messaggio dal servizio APN e, se necessario, recupera l’allegato da iCloud. Il numero di telefono o l’indirizzo e‑mail del mittente viene confrontato con i contatti del destinatario per poter visualizzare un nome, se possibile.
Come per tutte le notifiche push, il messaggio viene eliminato dal servizio APN una volta consegnato. Tuttavia, a differenza di altre notifiche APN, i messaggi iMessage vengono messi in coda per essere consegnati ai dispositivi non in linea. I messaggi restano memorizzati sui server Apple per un massimo di 30 giorni.