2016-12-24 60 views
1

我必須創建一個電子郵件驗證和密碼重置系統,因此我需要一個令牌生成器。起初我認爲這些令牌必須是絕對唯一的,但是當我檢查數據庫中的哈希(令牌)和電子郵件時,我不明白爲什麼我不應該使用足夠長度的隨機字符串,而不會追加uniqid()例如這也會很明顯)。有一個帳戶驗證或密碼重置令牌真的是唯一的?

我對這個假設是否正確?

+3

是的,他們需要是唯一的,只能使用一次。如果同一個用戶去並且試圖使用相同的密鑰並且不被允許,那麼這可能是一個問題。 –

+0

另外,如果你使用的是數據庫中的AI/PK密鑰(你應該),那麼使用一個唯一的密鑰以及AI/PK,將使它更加獨一無二的「給用戶」。順便說一句,我回到了問題,看看是否還有活動;還有一條評論,但被刪除了。我唯一看到的更多的是我的評論。我認爲這個問題與這個問題很相似(應該)回答這個問題。如果你願意,你可以ping我,因爲我現在已經把問題留給了好人。享受你的聖誕,*歡呼* –

回答

1

不是,它只需要爲該用戶唯一。

例如,您可以將密碼重置爲要求提供用戶名或電子郵件地址的一部分。在這方面,您的重置令牌只需要對該用戶唯一。

而且,由於你沒有查找令牌已知良好的令牌的列表它的速度更快的所有用戶。

例如,一個全球唯一的密碼重置令牌我要麼必須使用一些額外的細節爲用戶信息等,以區別於其他人令牌或我必須通過某種方式的所有已知標記的搜索。

使用唯一的用戶/哈希碼我只需驗證爲此用戶提供的代碼是否有效。通過比較,你通常會發現一個數組搜索,甚至一個哈希表查找將花費更多的時間。

例如,如果用戶沒有啓動密碼重設,其內部用戶可能是這樣的比較,如果他們有。注意在這個例子中,我們只允許一個最近的密碼重置請求(而不是多個):

User.getName() = "Bob" 
User.getUserName() = "Bob5412" 

User.resetPasswordRequestedTime() = null 
User.resetPasswordToken() = null 
or 
User.resetPasswordRequestedTime() = 1482628217 
User.resetPasswordToken() = "f7de43859d244439b101df4e02cc4e17" 

現在我只需要檢查,如果令牌是有效的請求用戶。無需擔心「全球獨一無二」。

在我的代碼我可能需要的任何密碼重置請求由4小時內,用戶可以完成,因此,如果他們的要求之後排在我不理會,不檢查任何他們的請求。

+0

是的,正是我的想法。而令牌過期函數絕對是我會實現的,因爲它是減少可用脆弱令牌池的好方法。 –