在简单的服务器客户端设置(最好是服务器处于无状态状态)中,防止重放攻击的最佳实践或标准化方法是什么?
什么时候应该使用时间戳、序列号和非the,它们之间的主要目的/区别是什么?
发布于 2019-04-13 14:32:22
AEAD构造加密消息并附加身份验证标记。该身份验证标记是使用以下数据计算的:
在解密过程中,使用相同的数据计算身份验证标记,并与附加到密文的验证标记进行比较。
为了防止重放攻击,接收方必须隐式地知道这些参数之一。
确保这一点的一种简单方法是将初始的nonce设置为给定的值,并在每条消息之后增加它。
发起人只发送初始化向量。单个消息不包含用于加密它们的not副本。它们不必这样做,因为接收方可以执行与发送方相同的操作,即在接收到的每条加密消息之后增加nonce,以便解密流。
如果正在解密的流与原始流不匹配,因为消息已被更改、删除、添加、复制或重新排序,则身份验证标记将不匹配由接收方使用预期的nonce计算的标记。将通过验证标记立即检测到此问题。
当使用像UDP这样的传输协议时,加密的消息不能按顺序接收。一些数据报也可能丢失或复制。应用程序必须重新排序并处理重传。
在这种情况下,可以向每条加密消息中添加一个nonce的副本,或者表示与初始nonce之间的差异的值。由于除了密钥之外,消息是使用唯一的当前加密和身份验证的,因此解密过程将立即检测到其附加的当前已被篡改的加密消息。
现在,如果服务器是“无状态的”,就没有办法确保以前没有收到过消息。但是,仍然可以检查接收到的消息是否太旧(“太老”的定义是特定于应用程序的)。
将时间戳附加到消息或密文上。如果它被附加到密文,包括它是额外的数据,所以它将是标签计算的一部分。
然后,接收方可以检查时间戳是否未被篡改,并且它是否比预期的更早。
这需要同步时钟,并且再次只提供部分保护,防止重播攻击。
https://crypto.stackexchange.com/questions/68750
复制相似问题