SSL/TLS 握手中的 nonce

信息安全 tls 随机数
2021-09-12 22:11:07

在 SSL/TLS 握手中,客户端总是将 nonce 发送到服务器,反之亦然。nonce 基本上由一个随机数和 unix 时间戳组成。为什么我们需要unix时间戳?

由于 nonce 总是一个随机数,这如何防止中间人的重放攻击?作为随机事件,相同的随机数可能会在与同一服务器的另一次握手中重复。

有人可以告诉我这个随机数的任何其他目的吗?

2个回答

服务器绝不应该允许重复的随机数。这就是防止重放攻击的方法。有人可以捕获并尝试重新发送您的消息,但它将被拒绝,因为该随机数已被记录并且无法再次使用。

如果您有一个时间戳并拒绝早于 5 分钟的请求,那么您可以每 5 分钟清除一次已用随机数的缓存。您可以清除您的 nonce,因为即使他们此时重播了一个,它也会看到时间戳已过期并且无论如何都会失败。这意味着您不必将每个使用过的 nonce 保留到时间结束,这会导致更少的存储空间和更快的查找时间。

在 TLS 1.2 及之前版本中,客户端和服务器 Hello 消息的 Random 字段确实具有随机字节部分和时间戳。时间戳的目的是增加获得唯一值的机会,即使随机数生成器存在缺陷并产生重复的随机字节也是如此。

然而,这不是当前的做法,现代 TLS 实现只是发送一个完全随机的序列,因为隐私问题(泄露本地时间)。出于这个原因,时间部分已在TLS 1.3 草案中删除

来自双方的随机数与另一个共享密钥结合形成一个会话密钥(参见RFC 5246 TLS,密钥计算)。因此,即使一方在 hello 握手消息中发送了重复的随机序列,也不会产生相同的会话密钥。