如何存储加密后的消息内容?

Maximize job database potential with expert discussions and advice.
Post Reply
muskanislam99
Posts: 243
Joined: Sat Dec 28, 2024 5:47 am

如何存储加密后的消息内容?

Post by muskanislam99 »

存储加密后的消息内容是 WhatsApp 架构中端到端加密(End-to-End Encryption, E2EE)实现的核心,也是其安全和隐私承诺的基石。服务器在整个消息生命周期中无法访问消息的明文内容。因此,数据库存储的是加密后的二进制数据。

1. 核心原则:BLOB 数据类型
数据类型: BLOB (Binary Large Object)
原因: BLOB 类型被设计用于存储任意的二进制数据。加密后的消息内容,无论原始是文本、图片、视频还是其他类型,在加密后都会变成一串无结构的二进制字节流。BLOB 能够忠实地存储这些字节,而不对其进行任何解释(如字符集编码),这正是 E2EE 所要求的。
2. 加密流程与存储点
了解加密流程有助于理解为何存储的是 BLOB:

发送方设备(加密):

用户 A 在其设备上编写一条消息(文本、附加图片等)。
WhatsApp 客户端使用 Signal 协议(或其他类似的端到端加密协议)对消息 厄瓜多尔 whatsapp 数据库 的明文内容进行加密。这个加密过程通常涉及一个通过 Diffie-Hellman 密钥交换和会话密钥派生生成的对称加密密钥。
加密后的结果是一个密文(Ciphertext),它是一个无意义的二进制序列。
同时,可能还会生成一个**消息认证码(MAC)**以验证消息的完整性和真实性,防止篡改。
所有这些(密文 + MAC + 其他加密元数据,如初始化向量 IV)被打包成一个加密的消息单元。
发送到服务器:

打包好的加密消息单元从发送方设备发送到 WhatsApp 服务器。
在传输过程中,整个通信通道也会通过 TLS/SSL 进行加密(这是传输层加密,与端到端加密是两码事)。
服务器存储(不解密):

WhatsApp 服务器接收到加密消息单元。服务器没有解密密钥(解密密钥只存在于发送方和接收方设备上)。
服务器将接收到的加密消息单元作为一个完整的二进制数据块,直接存储到数据库中的 Messages 表的 content 字段。
数据类型: BLOB 是最适合存储这种二进制数据的类型。它不关心数据的内容是文本、图片还是其他,只将其视为字节序列。
存储位置: 通常存储在为消息设计的高吞吐量 NoSQL 数据库(如 Apache Cassandra)中,并通过 chat_id 或 group_id 进行分片。
服务器路由/分发:

服务器的核心职责是根据消息的 chat_id 或 group_id 将其路由到正确的接收方用户或群组。
如果接收方在线,消息直接推送。如果离线,消息会在服务器的临时队列或数据库中等待,直到接收方上线。
无论是哪种情况,服务器始终传输和存储加密后的消息,从不尝试解密。
接收方设备(解密):

接收方设备收到加密消息。
WhatsApp 客户端使用其本地存储的密钥(通过与发送方协商的会话密钥)对收到的二进制数据进行解密。
解密成功后,得到原始的明文消息内容(文本、图片等)。
客户端然后根据消息类型(message_type 字段)来渲染和显示内容。
3. BLOB 字段的特点和考量
大小限制: 不同数据库对 BLOB 类型有不同的最大大小限制。例如,MySQL 的 TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB 分别支持不同大小。对于 WhatsApp 来说,单个消息的内容(即使是加密后的)通常不会太大,BLOB 或 MEDIUMBLOB 通常足够。对于大型媒体文件,如视频,如前所述,它们的实际内容是存储在外部对象存储中的,BLOB 字段只存储其加密的 URL 和密钥。
索引: 通常不会在 BLOB 字段上直接创建索引,因为其内容是二进制且不可查询的。消息的查询和排序主要依赖于 chat_id、sender_id、timestamp 等其他字段。
存储效率: BLOB 类型会根据实际存储的数据大小占用相应的空间,有助于节省存储。
4. 与 TEXT 或 JSON 的区别
TEXT/VARCHAR: 这些是用于存储字符数据的,它们会涉及到字符集(如 UTF-8)和排序规则。将加密后的二进制数据强制存储为文本,会导致数据损坏、编码问题,或者至少是无效的操作。数据库会尝试将其解析为字符,而加密数据不是字符。
JSON/JSONB: 这些是用于存储结构化 JSON 数据的。虽然某些元数据可以以 JSON 格式存储,但加密后的消息内容本身是无结构的密文,不是有效的 JSON。
综上所述,WhatsApp 存储加密后的消息内容几乎必然会使用BLOB 数据类型。这是因为 BLOB 能够原生、高效地存储无结构的二进制数据流,完美契合端到端加密的要求,确保了消息在服务器端的保密性和完整性。
Post Reply