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