iMessage 如何安全地傳送和接收訊息
使用者藉由輸入位址或姓名來開始 iMessage 對話。如果他們輸入電話號碼或電子郵件地址,裝置就會聯絡「Apple 識別服務」(IDS)以擷取與該位址綁定的所有裝置的公用密鑰和 APNs 位址。如果使用者輸入的是名字,裝置會先使用使用者的「聯絡人」App 來收集與該名字綁定的電話號碼和電子郵件地址,然後再從 IDS 取得公用密鑰和 APNs 位址。
使用者的外送訊息會針對接收者的每個裝置進行個別加密。接收裝置的公用加密密鑰和簽署密鑰會從 IDS 擷取。針對每部接收裝置,發送裝置會產生隨機 88 位元的值並將其作為 HMAC-SHA256 密鑰,以建立從傳送者與接收者公用密鑰與純文字衍生的 40 位元值。88 位元與 40 位元值的鏈結會產生 128 位元的密鑰,該密鑰會在計數器(CTR)模式下使用 AES 來加密訊息。接收者端會使用 40 位元的值來驗證解密純文字的完整性。系統會對接收裝置的公用密鑰使用 RSA-OAEP 以加密每則訊息的 AES 密鑰。加密訊息文字與加密訊息密鑰的組合接著會以 SHA-1 進行雜湊運算,而雜湊值會使用發送裝置的專用簽署密鑰以橢圓曲線數位簽章算法(ECDSA)進行簽署。在 iOS 13 或以上版本和 iPadOS 13.1 或以上版本中,裝置可使用橢圓曲線整合加密方案(ECIES)加密,而非使用 RSA 加密。
產生的訊息(每部接收裝置一則)是由加密訊息文字、加密訊息密鑰及傳送者的數位簽章所組成。這些訊息隨即會分送至 APNs 進行遞送。時間戳記和 APNs 路由資訊等後設資料則不會加密。與 APNs 的通訊會使用前向安全 TLS 通道進行加密。
視 iOS 或 iPadOS 版本而定,APNs 最多只可以中繼大小為 4 或 16 KB 的訊息。若訊息文字過長或隨附了附件(如照片),附件會使用 AES 在 CTR 模式下以隨機產生的 256 位元密鑰進行加密並上傳至 iCloud。附件的 AES 密鑰、其「統一資源識別碼」(URI)和其加密表單的 SHA-1 雜湊值隨後會以 iMessage 內容的形式傳送給收件者,並透過正規的 iMessage 加密保有這些內容的保密性和完整性,如下圖所示。
對於群組對話,每位接收者與其裝置之間都會重複此過程。
接收方的每部裝置都會從 APNs 接收到一份訊息,且如有需要,裝置會從 iCloud 擷取附件。若傳送者的來電號碼或電子郵件地址與接收者的聯絡人相符,則會顯示一個名字。
與所有推播通知一樣,訊息在遞送後便會從 APNs 中刪除。然而,與其他 APNs 通知不同的是,若裝置離線,iMessage 訊息會排入佇列等待發送。訊息最多可在 Apple 伺服氣上儲存 30 天。