iMessageでのメッセージの安全な送受信方法
iMessageで会話を開始するには、相手のアドレスまたは名前を入力します。ユーザが電話番号またはメールアドレスを入力すると、デバイスはApple Identity Service(IDS)と通信し、受信者に関連付けられたすべてのデバイスの公開鍵とAPNsアドレスを取得します。ユーザが名前を入力すると、デバイスはまずユーザの「連絡先」を使用してその名前に関連付けられた電話番号およびメールアドレスを収集したあと、IDSから公開鍵とAPNsアドレスを取得します。
ユーザの送信メッセージは、受信者のデバイスごとに個別に暗号化されます。受信デバイスの暗号鍵と署名鍵は、IDSから取得されます。送信デバイスは受信デバイスごとにランダムな88ビット値を生成し、この値をHMAC-SHA256鍵として使い、送信者と受信者の公開鍵とプレーンテキストから導出される40ビット値を構成します。88ビット値と40ビット値を連結させて128ビット鍵を作り、この鍵を利用してAESのカウンター(CTR)モードでメッセージを暗号化します。40ビット値は、復号されたプレーンテキストの整合性を検証するために受信側で使用されます。このメッセージごとのAES鍵は、RSA-OAEPを使用して受信デバイスの公開鍵に対して暗号化されます。次に、暗号化されたメッセージテキストと暗号化されたメッセージ鍵の組み合わせがSHA-1を使ってハッシュ化され、送信デバイスの署名用秘密鍵を用いてハッシュにECDSA(楕円曲線デジタル署名アルゴリズム)の署名が付加されます。iOS 13以降およびiPadOS 13.1以降では、デバイスはRSA暗号化の代わりに楕円曲線統合暗号化スキーム(ECIES)暗号化を使用する場合があります。
その結果、メッセージは、暗号化されたメッセージテキスト、暗号化されたメッセージ鍵、および送信者のデジタル署名から構成され、受信デバイスごとに異なるメッセージになります。この後メッセージはAPNsに送られて配信されます。タイムスタンプやAPNsの経路情報などのメタデータは暗号化されません。APNsとの通信は、前方秘匿性を持つTLSチャネルを使用して暗号化されます。
APNsが中継できるメッセージのサイズは、iOSまたはiPadOSのバージョンに応じて最大4または16 KBです。メッセージのテキストが長すぎる場合、または写真などの添付ファイルが含まれる場合は、添付ファイルが、ランダムに生成された256ビット鍵でAESのCTRモードを用いて暗号化され、iCloudにアップロードされます。次に、添付ファイルのAES鍵、Uniform Resource Identifier(URI)、および暗号化結果のSHA-1ハッシュが、iMessageの内容として受信者に送信されます。それらの機密性と整合性は、次の図に示す標準のiMessage暗号化機能によって保護されます。
グループ会話の場合は、各受信者のデバイスごとにこのプロセスが繰り返されます。
受信側では、各デバイスがAPNsからメッセージのコピーを受信し、必要に応じてiCloudから添付ファイルを取得します。可能な場合は名前を表示できるように、送信者の発信電話番号またはメールアドレスが受信者の連絡先情報と照合されます。
すべてのプッシュ通知と同様に、メッセージは配信された時点でAPNsから削除されます。ただし、ほかのAPNs通知と異なり、iMessageのメッセージはオフラインデバイスへの配信のためにキューに入れられます。メッセージはAppleのサーバに最長30日間保存されます。