Skip to content

第7章:协议组合与实现安全

抽象证明之外的接口

安全证明通常假定密钥真正随机、算法按规定执行、接口只泄露模型允许的信息。实现中的时间、缓存访问、错误消息和电磁泄漏可能提供额外观察。

例如逐字节比较标签并在首个不同处退出,会使执行时间与匹配前缀有关。常数时间实现需要更广泛地控制秘密相关分支和访存,不能只把一个比较循环改写就宣布整个程序无侧信道。

密钥生命周期

密钥需要生成、分发、使用、轮换和销毁。一个长期主密钥可通过明确上下文派生不同用途的子密钥,避免同一原始密钥直接用于多个不兼容原语。

轮换还涉及旧消息如何解密、哪些旧签名仍可信、nonce 计数器是否重置等状态。多进程或多机共享密钥时,单机递增计数器未必保证全局 nonce 唯一。

文件加密的完整设计

设要加密大文件,可将其分块。每块使用独立且不重复的 nonce,并把文件 ID、块号和格式版本放入认证上下文。接收者还需验证总长度或最终块标记,否则攻击者可能截掉尾部而保留所有剩余块的合法标签。

交换两个块可能不破坏各块的独立标签,但若块号被认证且按位置验证,就能发现调换。局部完整性与整份文件的顺序、完整性是不同要求。

综合练习

  1. 为分块文件加密写出头部、nonce 分配和最终完整性检查规则,说明崩溃重启后如何避免复用 nonce。
  2. 一个服务对“填充错误”和“标签错误”返回不同响应,分析这增加了何种攻击者能力。
  3. 为某通信协议列出机密性、认证、重放保护、前向安全分别由哪个机制提供,哪些前提若失效会使结论不成立。

部署应选择维护良好的标准协议和密码库。数学例子的价值在于理解保证与前提,不能代替协议编码、参数选择和实现审计。

上次更新: