2013-03-24 68 views
1

我有下面的代碼片段我在哪裏構建一個字符串發送給用戶的電子郵件驗證碼:我的SHA1'd字符串是否有可能不唯一?

$confirmation_code = $user_id . time() . date('d-m-Y',time()); 
$confirmation_code = sha1($confirmation_code); 

有沒有在任何步驟被複制的$confirmation_code任何機會呢?

注:請記住,$user_id是唯一爲每個用戶

+0

看看此相關的職位:http://security.stackexchange.com/questions/29071/will-sha1-of-email-addresses-always-be-唯一#29073 – Aiias 2013-03-24 08:20:08

+0

請考慮[備註](http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash)也 – 2013-03-24 08:23:08

回答

1

鑑於$user_id是爲每個用戶唯一的,這應該(理論上)意味着你的確認碼不應該發生衝突(是「非唯一」)

然而,在現實中,SHA1散列可以衝突(見this MSDN blog article獲取更多信息)。

因此,如果你問這個問題的原因是這樣你就可以決定是否要使列UNIQUE在數據庫中,沒有。

+0

在文章中主要錯誤 - MD5哈希值* 16 *字節長。它們在十六進制編碼時只有32個字節長。 – Alnitak 2015-09-29 14:51:12

+0

@Alnitakt看來作者混淆了32字節的字符串長度和字節數。 – 2015-09-30 22:53:32

+0

是的,這就是我所說的。 – Alnitak 2015-10-01 07:24:49

1

是的,代碼是唯一的,除非您每秒生成多個用戶。這也是極好的可預測。如果攻擊者知道用戶的ID和正在生成的代碼時的粗糙時間,是微不足道的猜碼。如果允許攻擊者進行無限數量的猜測,即使艱難的時間並不重要,因爲他可以在過去的幾年中輕鬆地嘗試所有有效的代碼。

你真的應該生成一個(僞)隨機代碼,而不是基於靜態數據的代碼。在Linux上,剛剛從/dev/random閱讀:

$code = bin2hex(file_get_contents('/dev/random', false, null, -1, 32)); 
                    ^^ 
                  desired length/2 
相關問題