分片加密不能直接用aes.Encrypt处理整个文件,因该方法是内存级操作,加载2GB文件将导致内存爆满;必须采用流式分块(如1MB/片)、每片独立随机IV、PKCS#7填充对齐、header携带shard_id等元信息,并严格验证填充后才写盘。

分片加密为什么不能直接用 aes.Encrypt 处理整个文件
因为内存会爆。Go 的 aes.Encrypt 是内存内操作,读完整个 2GB 文件再加密,至少要双倍内存(原始 + 密文),实际还叠加 GC 压力。真实场景中,你得边读边加解密,用流式处理 —— 也就是 cipher.Stream 接口,配合 io.Pipe 或分块 io.ReadFull 手动控制。
常见错误是:把大文件 os.ReadFile 进来再分片,这一步就失败了;或者误用 aes.NewCipher 后直接调 crypter.XORKeyStream 却没对齐块大小,导致末尾字节错乱。
- 必须按 AES 块大小(16 字节)对齐分片,最后一块不足时需 PKCS#7 填充(解密端才能干净剥离)
- 每个分片要带独立 IV,不能复用 —— 否则相同明文块会产生相同密文块,泄露结构
- IV 不需要保密,但必须随分片一起传输;建议 prepended 到该分片数据前(共 16 字节),解密时先读出再初始化
cipher.Stream
如何安全生成并管理每片的 IV 和密钥
密钥不能硬编码,也不能每次随机生成后丢弃 —— 解密端必须能还原出同一密钥。推荐方案:主密钥(如用户口令)通过 scrypt.Key 派生出固定长度密钥,再用该密钥 + 分片序号做 HKDF,为每片生成唯一子密钥。这样既避免密钥复用风险,又不需要额外存储密钥。
IV 更简单:用 crypto/rand.Read 为每片生成 16 字节随机 IV 即可,它不需保存,随片发送就行。别用时间戳或序号当 IV,那等于没用。
立即学习“go语言免费学习笔记(深入)”;
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
scrypt.N = 1<<15、r = 8、p = 1是当前较稳妥的参数组合(兼顾安全与性能) - HKDF salt 可固定(如
[]byte("file-shard-aes-iv")),info 用分片索引字符串(fmt.Sprintf("shard-%d", i)) - 千万别把 IV 当作“盐”参与密钥派生 —— IV 是公开的,盐应保密;二者职责不同
分片传输协议怎么设计才不怕丢包和乱序
HTTP 或 TCP 本身不保证分片到达顺序,更不保证全部到达。所以协议层必须自带元信息:每个分片 payload 开头放一个固定长度 header(例如 8 字节),包含:shard_id(uint32)、total_shards(uint16)、payload_len(uint16)。解密端收到任意分片,都能知道它属于哪个文件、共几片、自己该处理多长数据。
丢包检测靠接收方维护已收 shard_id 集合,最后比对是否 == [0, total_shards)。乱序不用管 —— 写磁盘时按 shard_id 定位偏移即可,比如第 i 片写入位置是 int64(i) * shardSize(首片可能略小,因含 IV)。
- header 必须用
binary.BigEndian.PutUint32等确定字节序,别依赖平台默认 - 单片大小建议设为 1MB(1024 * 1024),太小增加 header 开销,太大拖慢单片失败重传成本
- 不要在 header 里放校验和(如 CRC32)—— AES-GCM 更好,但如果你坚持用 CBC,至少对密文块做
sha256.Sum256并附在 header 后(额外 32 字节)
解密端如何避免写入未验证的密文到磁盘
最危险的操作:收到分片就立刻 Write 到临时文件,等全部收完再解密 —— 这样攻击者可伪造任意密文触发解密崩溃,或填满磁盘。正确做法是:每片收到后,先完成完整解密 + 填充验证(PKCS#7),仅当无 panic 且末尾填充合法,才写入对应偏移。
填充验证不能只看最后一个字节值,还要检查前面若干字节是否全等于该值(例如末字节是 0x07,则倒数 7 字节都得是 0x07),否则可能绕过。
- 用
bytes.Equal对比填充区域,别用==比较切片引用 - 解密失败的分片,记录日志并丢弃,不写磁盘,也不影响其他分片流程
- 临时文件建议用
os.CreateTemp("", "decrypt-*.bin"),避免路径遍历或覆盖已有文件
IV 的随机性、分片 header 的结构化、填充验证的严格性 —— 这三处任一松动,都会让整个分片加解密体系在真实网络中迅速失效。

















