2016-02-21 44 views
3

我開始在我的項目上開發用戶註冊。用戶將通過電子郵件發送的鏈接確認他們的註冊。安全使用md5散列作爲註冊字符串標記?

我以爲我可以使用表單上插入的電子郵件,加上一個隨機鹽,並對這個連接的字符串進行散列,這樣就可以使每個字符串標記都是唯一的。鏈接將是這樣的:

http://www.example.com/register/7ddf32e17a6ac5ce04a8ecbf782ca509 

我認爲這是很好,很容易建立,但我不知道它是否足夠安全。

我正在開發使用CakePHP 2.7和SQL Server這個項目2014年

+1

查看https://github.com/cakephp/cakephp/pull/8297 - 這也將很快在2.x.如果您使用Tools插件,那麼您可以在那裏使用[Tokens](http://www.dereuromark.de/2010/06/25/tools-plugin-part1-codekey/),因爲它們已經內置了它。 – mark

回答

6

這真的取決於你如何生成MD5。只要確保你的數據是隨機的。我不使用MD5產生這些類型的哈希,而是會做這樣的事情:

$email_token = openssl_random_pseudo_bytes(16); 
$token = bin2hex($email_token); 

就個人而言,我會選擇這樣的事情,如果使用PHP7使用random_bytes

$email_token = bin2hex(random_bytes($length)); 

對於PHP5有可用的填充工具:https://github.com/paragonie/random_compat

+0

這是一個非常好的主意,但是這在計算上並不昂貴嗎?每次創建令牌時,我都必須在數據庫中驗證該令牌是否尚未創建。 –

+0

將用戶插入數據庫時​​生成令牌的成本要比MD5高一點,但除非您談論嚴重的流量/使用情況,否則您不會真正注意到這種差異。至於在用戶驗證他們的電子郵件時檢查密鑰,這不會花費比檢查MD5更多的資源。你只是檢查,看看他們是否匹配。 – BugHunterUK

+0

我明白了。我認爲這是我尋找的解決方案,因爲它與其他答案一致。非常感謝。 –

2

你應該想想一個潛在的攻擊者可以做,如果他是能夠產生不屬於他,然後決定是否MD5哈希令牌夠好了。

如果我得到它正確,你只是想驗證用戶的電子郵件,只有當用戶真正擁有電子郵件地址創建一個帳戶。如果攻擊者使用僞造的電子郵件創建1000個帳戶,那麼對於您或該地址的所有者是否會造成不良影響?

一如既往,安全取決於IMO的情況。

如果您想安全玩,請不要讓您的令牌依賴於用戶數據。生成一個完全隨機的令牌,並將其保存在數據庫中的掛起註冊旁邊。

+0

這就是鹽的想法。鹽將是一個隨機字符串,我會連接用戶的電子郵件和散列它。 –

+0

是的,但如果攻擊者知道你的鹽,他可以爲任何電子郵件生成有效令牌。如果您爲每個註冊生成一個完整的隨機標記,這是不可能的。 – siegi

+0

我明白了。你是對的。我不會使用用戶的數據來創建令牌。 –

2

使用完全隨機您在註冊時生成的用戶的值,通過'sha1'或'sha2'運行它,將其存儲在數據庫中,並在電子郵件中使用它。然後您只需檢查該值是否在數據庫中。如果您想另外將散列與另一個數據點(例如他們的電子郵件)關聯更好。

+0

如果初始值是完全隨機的,則對它進行散列沒有意義;它不會增加任何安全性。當然,這一切都取決於隨機函數,但這是一個完全不同的問題。 – JvO

+0

在電子郵件中使用unhahed版本。哈希存儲的版本可以防止任何數據泄漏,從而使攻擊者可以使用這些值。 – SilverlightFox