Appleプラットフォームのセキュリティ
iMessageの安全な「名前と写真の共有」
iMessageの「名前と写真の共有」では、ユーザがiMessageを使って名前と写真を共有できます。ユーザはマイカードの情報を選択するか、名前をカスタマイズしたり自分で選んだ写真を含めたりできます。iMessageの「名前と写真の共有」では2ステージのシステムを使用して名前と写真が配信されます。
このデータはフィールド別に分割されて個別に暗号化および認証されると共に、以下のプロセスで全体が認証されます。次の3つのフィールドがあります。
名前
写真
写真ファイル名
データ作成の最初のステップでは、デバイス上で128ビットのレコードキーがランダムに生成されます。次に、HKDF-HMAC-SHA256によってこのレコードキーが導出され、Key 1:Key 2:Key 3 = HKDF(レコードキー、“nicknames”)という3つのサブキーが作成されます。ランダムな96ビットのIV(初期化ベクトル)がフィールドごとに生成され、AES-CTRおよびKey 1を使ってデータが暗号化されます。その後、Key 2を使って、フィールド名、フィールドのIV、フィールドの暗号テキストを秘匿してHMAC-SHA256でメッセージ認証コード(MAC)が計算されます。最後に、個別のフィールドのMAC値が連結され、そのMACがKey 3を使ってHMAC-SHA256で計算されます。暗号化されたデータと共に、この256ビットのMACが保存されます。このMACの最初の128ビットがRecordIDとして使用されます。
その後、この暗号化されたレコードがCloudKit公開データベースのRecordIDの下に保存されます。このレコードが変更(ミューテート)されることはなく、ユーザが自分の名前と写真の変更を選択したときは、新しい暗号化されたレコードがその都度生成されます。ユーザ1が自分の名前と写真をユーザ2と共有することを選択した場合、そのレコードキーがiMessageペイロード内のrecordIDと共に送信され、このペイロードが暗号化されます。
ユーザ2のデバイスがこのiMessageペイロードを受信すると、ペイロードにニックネームおよび写真のrecordIDと鍵が含まれることが通知されます。次に、ユーザ2のデバイスがCloudKit公開データベースにアクセスし、そのrecordIDの暗号化された名前と写真を取得して、iMessageを使用して転送します。
メッセージが取得されると、ユーザ2のデバイスはペイロードを復号し、recordID自体を使用して署名を検証します。検証に合格すると、名前と写真がユーザ2に表示され、ユーザ2はこれを自分の連絡先に追加するか、「メッセージ」で使用することを選択できます。