生成递增的 Nonce
Generating an increasing Nonce
到目前为止,我使用它来生成一个简单的 nonce
,当使用 API 进行身份验证时:
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
始终在增加,所以我不太确定如何确保这一点,而不为将来保存变量 [=12] =] 一代 - 或者这是无法避免的?
time.time
只会在系统时钟更新时倒退 - 因为 DST 不适用于 seconds-since-epoch,这永远不会发生在保持时钟最新的系统上使用 ntp.
*nix 特定的解决方案是在启动时添加检查以确保 ntpd 在生成它的第一个随机数之前是 运行。一旦 运行,ntpd 将不会倒转时钟(它只会使时钟向前移动的速度比每秒慢 1 秒),所以这对您来说可能是一个充分的保证。
这完全取决于您的情况以及对风险和安全的偏好trade-offs,但我建议这是一个学术问题,而不是实际问题。
到目前为止,我使用它来生成一个简单的 nonce
,当使用 API 进行身份验证时:
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
始终在增加,所以我不太确定如何确保这一点,而不为将来保存变量 [=12] =] 一代 - 或者这是无法避免的?
time.time
只会在系统时钟更新时倒退 - 因为 DST 不适用于 seconds-since-epoch,这永远不会发生在保持时钟最新的系统上使用 ntp.
*nix 特定的解决方案是在启动时添加检查以确保 ntpd 在生成它的第一个随机数之前是 运行。一旦 运行,ntpd 将不会倒转时钟(它只会使时钟向前移动的速度比每秒慢 1 秒),所以这对您来说可能是一个充分的保证。
这完全取决于您的情况以及对风险和安全的偏好trade-offs,但我建议这是一个学术问题,而不是实际问题。