是否建议使用签名(使用私钥散列的查询数据)作为随机数来避免重放攻击?
Is it advisable to use a signature (query data hashed with a private key) as a nonce to avoid replay attacks?
我正在构建一个 API,其中每个请求查询字符串都包含以下内容:
- 一个时间戳
- 几个数据参数
- 一个public键
- 一个签名(用私钥散列的数据参数和时间戳)
收到请求时,服务器会检查时间戳并拒绝太旧的请求。服务器还验证签名。
是否建议将签名在数据库中保存一段时间,以确保在有效时间范围内没有重放攻击?这显然与 nonce 的工作方式很接近,但我很高兴听到您对这种方法的看法。
这是一个非常标准的技术。
但是,我会在列表中添加一个 "nonce" 字段。原因是如果在同一秒内发出两个合法请求会发生什么情况?仅存储签名,您将拒绝有效请求。
但是如果您让客户端生成一个 128 位以上的随机数并将其包含在请求中,那么他们每秒可以提交任意数量的请求。
然后,只需维护一个可见随机数列表以及时间戳。您可以根据时间戳的到期时间清除该列表。
我正在构建一个 API,其中每个请求查询字符串都包含以下内容:
- 一个时间戳
- 几个数据参数
- 一个public键
- 一个签名(用私钥散列的数据参数和时间戳)
收到请求时,服务器会检查时间戳并拒绝太旧的请求。服务器还验证签名。
是否建议将签名在数据库中保存一段时间,以确保在有效时间范围内没有重放攻击?这显然与 nonce 的工作方式很接近,但我很高兴听到您对这种方法的看法。
这是一个非常标准的技术。
但是,我会在列表中添加一个 "nonce" 字段。原因是如果在同一秒内发出两个合法请求会发生什么情况?仅存储签名,您将拒绝有效请求。
但是如果您让客户端生成一个 128 位以上的随机数并将其包含在请求中,那么他们每秒可以提交任意数量的请求。
然后,只需维护一个可见随机数列表以及时间戳。您可以根据时间戳的到期时间清除该列表。