【问题标题】:Generating an increasing Nonce生成越来越多的 Nonce
【发布时间】:2017-06-02 19:00:48
【问题描述】:

到目前为止,在使用 API 进行身份验证时,我已经使用它生成了一个简单的nonce

def nonce():
    return str(int(time.time()) * 1000)

It has now been pointed out to me,这并不完全安全,因为time.time() 可能会倒退:

>>> import time
>>> time.get_clock_info('time').monotonic
False

我将如何生成nonce? 我的第一个猜测是使用randint,但由于我需要确保nonce 始终在增加,我不太确定如何确保这一点,而不为未来的nonce 代保存变量 - 或者是这是不可回避的?

【问题讨论】:

  • from datetime import datetime; nonce = str(datetime.now().timestamp()).replace('.', '') 这样的东西怎么样?还是有同样的问题?还是太容易猜到了?

标签: python nonce


【解决方案1】:

time.time 只会在系统时钟在您下方更新时返回 - 因为 DST 不适用于 seconds-since-epoch,所以在使用 ntp 使其时钟保持最新的系统上永远不会发生这种情况。

*nix 特定的解决方案是在启动时添加一个检查,以确保 ntpd 在生成它的第一个 nonce 之前正在运行。一旦运行,ntpd 将不会使时钟倒转(它只会使其前进速度比每秒 1 秒慢一点),因此这对您来说可能是足够的保证。

这完全取决于您的情况以及对风险和安全权衡的偏好,但我建议这是一个学术问题,而不是实际问题。

【讨论】: