2017-01-18 48 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秒),所以這可能是您的充分保證。

它完全取決於您的情況和對風險和安全性權衡的偏好,但我認爲這是一個學術問題而不是實際問題。