一条带附件的消息发出去,通常只要几秒。手机把内容送进网络,服务器接收,消息写入数据库,附件写进磁盘或对象存储,另一端再下载。整个过程经过多个位置,每个位置面对的风险并不一样。
很多人判断有没有加密,只看聊天界面上的小锁。小锁能说明当前连接用了 HTTPS,说明传输这一段被保护了。它说明不了消息存进服务器以后是什么状态,也说明不了附件被下载、转发之后还能不能控制。把这三件事混在一起,就会把某一段的加密当成全链路加密。
全链路加密到底覆盖哪些环节,可以跟着这条消息走一遍。传输、存储、文件,三层各自解决不同的问题。
一、全链路加密,从消息发出的那一刻开始

1、传输加密保护两个端点之间
消息发出时,客户端先和服务器建立连接。TLS 协议在这条连接上提供保密性和完整性,防止内容在中间被读取或篡改。
这里有两个细节。证书用于确认客户端连上的确实是目标服务器,避免加密通道建在冒充者那里。TLS 1.3 每次连接使用临时密钥,长期私钥泄露,也不会让过去已经结束的会话被解开,这被称为前向保密。
附件上传走同一条通道。文字、图片、文件在上传阶段都受传输加密保护。
2、小锁只覆盖当前这一段
浏览器地址栏的小锁,或者聊天界面里的安全提示,通常只表示客户端到服务器这一段用了 HTTPS。它不表示数据写入磁盘后仍然加密,也不表示服务器管理员看不到明文。

传输加密的边界很清楚:保护数据在链路上不被窃听和篡改。连接到达服务器,TLS 的加解密就结束了。后面的处理发生在服务器内部,属于另一个层面。
3、传输层的范围止于连接两端
服务器被入侵、磁盘被拿走、备份文件流出,这些都不发生在链路上。传输加密再完整,也覆盖不到这些位置。全链路加密之所以要分三层看,原因就在这里。
二、数据进入服务器,存储加密接着开始
消息进入服务器后,全链路加密才走到第二层。消息和附件的保存位置不同,加密方式也不完全一样。
1、消息写入数据库之后
服务器收到消息,会做解析、路由、写入数据库等处理。消息在数据库里可能是明文,也可能是密文,取决于存储层有没有做加密。
数据库加密常见有两种做法。一种是在磁盘或存储卷层面加密,数据文件整体被保护。另一种是在字段或记录层面加密,指定内容以密文形式写入。前者对应用透明,后者可以做到更细的粒度。

无论哪种做法,目标都相同。即使数据库文件、磁盘或备份被直接拿走,里面的内容也不能被直接读取。
2、附件写入磁盘或对象存储之后
附件的处理路径和消息不同。文件体积更大,通常不会直接写进消息表,而是存到磁盘目录或对象存储,数据库只保留地址和权限信息。
静态数据加密要覆盖这些位置,包括在线存储、备份介质和迁移过程中的副本。只加密数据库,不加密文件存储,附件仍然是明文。
3、密钥放在哪里,决定加密是否成立
服务端加密是指文件写入存储之前,由服务端完成加密,读取时再由服务端解密。整个过程对用户透明,用户不需要保管密钥。大规模存储里更常见的是信封加密,每个文件或每批数据用一个数据密钥加密,数据密钥再用主密钥加密。主密钥放在密钥管理服务或硬件安全模块里。
存储层是否有效,不只取决于算法,还取决于密钥放在哪里、谁能取用。密钥和密文放在同一个数据库、同一台服务器、同一个权限范围里,拿到数据的人往往也能拿到密钥。
密钥管理包括生成、分发、轮换、吊销和审计。这些动作决定了存储加密能不能长期成立。
三、文件被下载转发,文件加密还在不在
1、文件被下载转发之后
消息通常留在聊天窗口里,文件的使用位置却不固定。文件可能被下载到本地、转发给其他人、用其他应用打开、同步到个人网盘,也可能留在本地缓存里。
一旦被下载或转发,文件就有了服务器之外的副本。文件层加密要回答的问题是:文件本身是不是密文,到了服务器之外还能不能保持加密状态。
2、服务端加密与客户端加密的分界
服务端加密发生在文件到达服务器之后。服务方持有密钥,能够解密文件,也能在权限允许时把明文返回给客户端。
客户端加密发生在文件上传之前。文件在本地完成加密,服务器收到的是密文,密钥由用户或用户所在的组织保管。服务方即使拿到文件,也无法直接解开。
两者的差别不在算法强弱,而在加密发生的位置和密钥由谁掌握。文件层加密是否成立,要看文件从客户端发出时处于什么状态。
3、权限控制不能替代文件加密
下载权限、访问范围、水印、转发限制,这些属于访问控制。它们决定谁可以取走文件,不改变文件本身是不是密文。

访问控制能降低越权访问的概率,但不能替代加密。文件绕过权限控制之后,是否还能被打开,取决于文件层有没有加密。这两件事要分开看,也要都做到。
四、三层接上,全链路加密才成立
1、三层对应三种不同的风险
传输层面对链路窃听和中间人攻击。存储层面对磁盘、数据库、备份被直接获取。文件层面对文件被下载或转发之后的扩散。
三层不是重复劳动。缺少一层,另外两层都无法覆盖它的范围。
2、密钥管理贯穿三层
三层加密都依赖密钥。传输层依赖会话密钥和证书私钥,存储层依赖数据密钥和主密钥,文件层依赖文件密钥或用户密钥。
密钥的存放位置、调用权限、轮换周期和审计记录,决定了加密是持续有效,还是只在部署当天有效。
3、一张表看清三层差异
| 层级 | 加密对象 | 主要应对的风险 | 常见做法 |
|---|---|---|---|
| 传输层 | 客户端与服务器之间的消息和文件 | 链路窃听、内容篡改、中间人冒充 | TLS 1.3、证书校验、临时密钥协商 |
| 存储层 | 数据库消息、磁盘和对象存储中的附件、备份 | 磁盘或数据库文件被直接获取 | 磁盘加密、数据库加密、信封加密、密钥管理服务 |
| 文件层 | 文件本身及其下载、转发后的副本 | 文件被下载或转发后被打开或扩散 | 服务端加密、客户端加密、文件密钥管理 |
全链路加密不是一项认证,也不是某个算法的名字。它描述的是一组环节的覆盖关系。看一个方案是否成立,可以依次确认三件事:消息和文件在传输时是否加密,落盘后是否仍然加密,文件到了服务器之外是否还是密文。三个答案都成立,三层才算接上。
总结
回到开头那条带附件的消息。它在手机上生成,经过网络到达服务器,写入数据库和文件存储,再被另一端下载。传输层保护它经过链路的那一段,存储层保护它留在服务器上的那一段,文件层保护它被下载或转发之后的去向。
三层各自成立,并且中间没有断开,全链路加密才成立。它不是某个算法的名称,也不是一项独立认证,而是一条路径上的连续覆盖。判断时不必先看宣传语,可以先问三个问题:传输有没有加密,落盘有没有加密,文件到了服务器之外还是不是密文。