跳到主要内容

~/posts · 2026.10.25

文件改了以后,旧分块不能跟着混进来

给加密分块绑定文件、内容版本和块序号,先解决能解密却读错内容的问题。

1 分钟 devshan

重新检查下载链路时,我想到一个容易漏掉的情况:文件编辑过一次,旧块和新块都还在存储里。要是客户端下载时拿混了,每一块都可能解密成功,拼出来的内容却是错的。

我给分块认证加上了文件身份、内容版本和块序号,用的是 AEAD 的附加认证数据 AAD。密文换了文件、版本或者位置,认证就会失败。解密后的分块清单也一起检查,块大小、总长度和数量异常时直接停止读取,免得按损坏的清单分配内存。

编辑文件时,我也改掉了原地覆盖的做法。新内容写成独立版本,准备好以后再更新文件元数据。正在下载的客户端继续读旧版本,新的写入失败也不会弄坏原来的文件。旧版本的清理由引用和任务状态决定。

顺着下载链路,我又补查了 Range、截断和长度处理。普通下载要读完整份内容,非法范围直接报错。之前这类错误可能表现为播放器拖动失败,或者文件下载完成后打不开。

这轮在隔离存储中跑了内容读写测试,除了请求状态,还逐字节比较下载结果。这套内容版本后来也用在了发送记录的附件共享上。