是否建议使用签名(使用私钥散列的查询数据)作为随机数来避免重放攻击?

Is it advisable to use a signature (query data hashed with a private key) as a nonce to avoid replay attacks?

我正在构建一个 API,其中每个请求查询字符串都包含以下内容:

收到请求时,服务器会检查时间戳并拒绝太旧的请求。服务器还验证签名。

是否建议将签名在数据库中保存一段时间,以确保在有效时间范围内没有重放攻击?这显然与 nonce 的工作方式很接近,但我很高兴听到您对这种方法的看法。

这是一个非常标准的技术。

但是,我会在列表中添加一个 "nonce" 字段。原因是如果在同一秒内发出两个合法请求会发生什么情况?仅存储签名,您将拒绝有效请求。

但是如果您让客户端生成一个 128 位以上的随机数并将其包含在请求中,那么他们每秒可以提交任意数量的请求。

然后,只需维护一个可见随机数列表以及时间戳。您可以根据时间戳的到期时间清除该列表。