2013-06-03 70 views
0

我的頁面上有一個區域用這樣的腳本保護:http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL 我現在需要的是某種密碼重置功能,以防忘記密碼。 只有幾個用戶,我儘量讓它變得簡單。是一個像這樣安全的php密碼重置功能嗎?

那麼如何,我認爲它會工作:

  1. 用戶輸入有電子郵件ADRESS
  2. 用戶將收到包含SHA512散列密碼的鏈接的電子郵件,它的用戶名作爲GET參數
  3. 腳本檢查閹的用戶名和密碼哈希適合
  4. 用戶現在可以輸入有新的密碼

這樣做是否存在強大的安全漏洞?或者這是一種常見的方式嗎?那最好的做法是什麼?我真的不想要任何額外的安全問題或這種東西...

更新:密碼哈希和鹽漬。

+1

sha512散列的東西,它不加密它們 – Quentin

+4

另外,你需要'絕對'確保你只發送電子郵件到他們已經註冊過的地址。您不能允許他們輸入任何電子郵件地址和用戶名以獲取密碼。任何人然後可以進來,輸入一個已知的用戶名,並逃脫它 –

+0

你是對的昆汀,我改變了。 – abimelex

回答

2

這裏是一個試探性的流動應該如何:

  1. 用戶點擊「重設密碼」鏈接。
  2. 電子郵件被髮送到註冊的用戶地址。
  3. 電子郵件包含一個在1小時後過期的獨特鏈接。
  4. 用戶點擊鏈接,被帶到密碼字段的頁面。
  5. 用戶輸入新密碼,密碼被散列並保存。

只是供參考,你不應該以任何方式傳輸密碼或他們的哈希值。

  1. 密碼不應該以原始形式或作爲無鹽信息保存。
  2. 散列不應傳輸。
+0

啊忘了寫密碼存儲爲鹽漬散列。你怎麼看待發送只是散列的前15個字母? – abimelex

+0

這也行不通,只要使用uniqid()來生成一個唯一的字符串併發送即可。 – adeelx

10

這並不像應該那樣安全。

您正在通過電子郵件發送用戶名和密碼(不可逆向工程),並且這些用戶名和密碼可能會在其他網站上重複使用。

使用隨機生成的字符串,而不是任何真正的憑據。將隨機字符串存儲在數據庫中,並使用它查找要重置密碼的用戶。只允許字符串在有限的時間內工作。

1

加密密碼散列應該存在的唯一位置是在您的服務器後端和其他地方。

如果攻擊者有散列需要檢查的話,攻擊者可以使用幾乎無限的處理能力來強制散列,而在任何其他情況下,攻擊者將不得不受限於服務器的容量,您將立即意識到這一點。

如果你想保持它的安全,生成隨機密碼重置密鑰,並將它們發送到用戶的註冊電子郵件(並沒有其他 - 電子郵件安全是用戶的問題)。如果用戶使用該密鑰返回網站(通常爲GET參數),那麼您可以讓用戶訪問密碼更改表單。

據我所知,這是目前最常用和最安全的密碼重置方法之一(儘管有2factor auth等)。