我有下面的代碼片段我在哪裏構建一個字符串發送給用戶的電子郵件驗證碼:我的SHA1'd字符串是否有可能不唯一?
$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);
有沒有在任何步驟被複制的$confirmation_code
任何機會呢?
注:請記住,$user_id
是唯一爲每個用戶
我有下面的代碼片段我在哪裏構建一個字符串發送給用戶的電子郵件驗證碼:我的SHA1'd字符串是否有可能不唯一?
$confirmation_code = $user_id . time() . date('d-m-Y',time());
$confirmation_code = sha1($confirmation_code);
有沒有在任何步驟被複制的$confirmation_code
任何機會呢?
注:請記住,$user_id
是唯一爲每個用戶
鑑於$user_id
是爲每個用戶唯一的,這應該(理論上)意味着你的確認碼不應該發生衝突(是「非唯一」)
然而,在現實中,SHA1散列可以衝突(見this MSDN blog article獲取更多信息)。
因此,如果你問這個問題的原因是這樣你就可以決定是否要使列UNIQUE
在數據庫中,沒有。
是的,代碼應是唯一的,除非您每秒生成多個用戶。這也是極好的可預測。如果攻擊者知道用戶的ID和正在生成的代碼時的粗糙時間,是微不足道的猜碼。如果允許攻擊者進行無限數量的猜測,即使艱難的時間並不重要,因爲他可以在過去的幾年中輕鬆地嘗試所有有效的代碼。
你真的應該生成一個(僞)隨機代碼,而不是基於靜態數據的代碼。在Linux上,剛剛從/dev/random
閱讀:
$code = bin2hex(file_get_contents('/dev/random', false, null, -1, 32));
^^
desired length/2
看看此相關的職位:http://security.stackexchange.com/questions/29071/will-sha1-of-email-addresses-always-be-唯一#29073 – Aiias 2013-03-24 08:20:08
請考慮[備註](http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash)也 – 2013-03-24 08:23:08