iMessage 信息如何安全发送和接收信息
用户通过输入一个地址或姓名来开始一次新的 iMessage 对话。如果他们输入一个电话号码或电子邮件地址,设备就会与 Apple 身份识别服务 (IDS) 进行联系,来提取与该联系人相关联的所有设备的公钥和 APNs 地址。如果用户输入的是一个名字,设备首先会使用用户的“通讯录” App 来收集与该名字相关联的电话号码和电子邮件地址,然后再从 IDS 中获取公钥和 APNs 地址。
对于每个接收者的设备,用户发出的信息都会单独进行加密。接收设备的公共加密密钥和签名密钥取自 IDS。发送设备针对每个接收设备生成一个 88 位随机值,并将其用作 HMAC-SHA256 密钥,以构成一个派生于发送者和接收者公钥以及明文的 40 位值。88 位值和 40 位值串联构成 128 位密钥,并在计数器 (CTR) 模式下使用 AES 加密连带的信息。接收方使用 40 位值验证解密后明文的完整性。此信息独有的 AES 密钥采用接收设备上用于加密公钥的 RSA-OAEP(算法)进行加密。之后使用 SHA-1 对加密的信息文本和加密的信息密钥进行混编,该哈希值会使用发送设备的专用签名密钥通过椭圆曲线数字签名算法 (ECDSA) 签名。在 iOS 13 或更高版本和 iPadOS 13.1 或更高版本中,设备可能使用椭圆曲线集成加密方案 (ECIES) 加密,而不是 RSA 加密。
针对每部接收设备所生成的每条信息包含加密的信息文本、加密的信息密钥和发送者的数字签名。信息然后会分派至 APNs 以进行发送。时间戳和 APNs 路由信息等元数据则不加密。与 APNs 的通信使用前向保密 TLS 频道加密。
APNs 最多只能转发大小为 4KB 或 16 KB 的信息,具体取决于 iOS 或 iPadOS 的版本。如果信息文本过长,或者附件中有照片等文件,那么附件会使用 AES 在 CTR 模式下通过随机生成的 256 位密钥进行加密并上传至 iCloud。附件的 AES 密钥、其统一资源标识符 (URI) 以及加密形式的 SHA-1 哈希值会作为 iMessage 信息的内容发送给收件人。常规的 iMessage 信息加密会保护以上内容的机密性和完整性,具体如下图所示。
对于群组对话,每一位接收者及其设备之间都会重复此过程。
对于接收方,每台设备接收到的是 APNs 发来的信息的副本,而且如有需要,设备会从 iCloud 提取附件。如果发送人的电话号码或电子邮件地址与接收者的通讯录相匹配,则会在可能的情况下显示一个名字。
与所有推送通知一样,信息在发出之后就会从 APNs 中删除。然而与其他 APNs 通知不同的是,如果设备不在线,iMessage 信息会列入队列等待发送。信息在 Apple 服务器上最长储存 30 天。