是否可以在没有存储的情况下实现随机数?

信息安全 oauth 随机数
2021-08-25 05:15:42

我正在考虑使用 OAuth 2.0 客户端实现身份验证模块,并且试图避免任何服务器状态。我正在彻底解决其他一些问题

似乎实现一个随机数需要在服务器上存储一些东西以确保不会发生重放攻击,因为请求不应该发生两次。

但是,这仅适用于身份验证/授权,不适用于表单提交数据,在这种情况下,实现 nonce 很容易,因为无论如何我都需要拥有服务器状态来捕获数据。

所以我看的越多,在这个用例中使用随机数似乎没有意义(除了登录,但那是授权服务器的问题),令牌(用服务器上的密钥加密基于OAuth的client_secret)我应该可以发送(直到它过期)。

有什么我可能会丢失的吗?

1个回答

来自问题:“因为请求不应该发生两次。”

没有存储意味着没有历史感,这是您要求某事不应该发生两次所必需的。所以答案是否定的。如果您希望您的服务器应用程序记住过去发生的事情,它必须能够将其存储在某个地方。

您可以实现一个有时间限制且不受使用限制的 nonce,并且您可以在没有服务器端存储的情况下执行此操作。您只需将时间戳附加到随机数(并对其进行签名,以便服务器可以验证并且攻击者无法伪造)并在 X 秒/分钟/小时后停止兑现它。重放攻击是可能的,但仅限于那个时间窗口。

您的服务器还需要一个值得信赖的时间来源。如果攻击者可以让你的服务器认为它是昨天的,那么昨天的随机数就会重新开始工作。