3.1. Nonce 生成要求 (Requirements on Nonce Generation)
3.1. Nonce 生成要求 (Requirements on Nonce Generation)
就安全性而言, 至关重要的是以符合下列要求的方式构造 nonce: 对任一固定密钥值, 每次调用认证加密操作时 nonce 值必须互不相同. 本节提醒读者注意该要求在不同场景下的一些后果.
当多个设备使用同一密钥进行加密时, 这些设备必须协调以保证 nonce 唯一. 简单做法是采用包含对每个设备互异字段的 nonce 格式, 如第 3.2 节所述. 注意, 只要完整 nonce 与密文一起发送或存储从而对解密方可用, 加密方与解密方之间不必协调 nonce 格式的细节. 若解密方无法获得完整 nonce, 则需知晓 nonce 的结构以便重建. 应用应该为加密引擎在选择 nonce 方面保留一定自由度; 例如, nonce 可同时包含计数器与由加密方设置但接收方不处理的字段. 该自由度使一组加密设备更易协调以保证各自 nonce 互异.
若某密钥将在较长时间内使用 (例如, 跨越多次重启), 则 nonce 需要保存在非易失存储器中. 在此类情况下, 必须使用 nonce 检查点 (checkpointing): 即应保存当前 nonce 值, 以便在意外故障后恢复加密状态. 一种简单做法是: 在加密进程收到存储进程确认 "下一个" nonce 值已写入后, 再使用当前 nonce 值, 从而高置信地避免重复使用. 由于可能显著增加时延, 亦可改为提前若干步存储 nonce 值. 例如, 可先存储 nonce 值 100, 再使用 1 至 99 进行加密; 在使用 1 至 99 的同时可将 200 写入存储, 依此类推.
在 nonce 协调困难的情形下, 更换密钥可避免许多 nonce 重用问题.
每种 AEAD 算法应该说明若无意中重用 nonce 值会导致何种安全性下降.