2017-01-18 50 views
1

到现在为止,我已经使用这个生成一个简单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一直在增加,我不太确定如何确保这一点,而不为将来的nonce代保存变量 - 或者这是不可避免的?

+0

怎么样''从datetime import datetime; nonce = str(datetime.now()。timestamp())。replace('。','')'?或者是否有同样的问题?或者是太容易猜测? –

回答

1

time.time只有当系统时钟在你下面更新时才会退后一步 - 因为DST不适用于秒以来的时间,所以在使用ntp保持时钟更新的系统上这绝不会发生。

* nix特定的解决方案是在启动时添加一个检查以确保ntpd在生成第一个随机数前运行。一旦运行,ntpd将不会将时钟恢复(它只会使其慢一点慢于每秒1秒),所以这可能是您的充分保证。

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