2012-08-10 86 views
1

我有網站上的用戶,他們的密碼被加密(md5)並存儲在數據庫中。現在,我有他們的電子郵件,如果有人忘記了他的密碼,我想給他發送鏈接以重置它的密碼。這是創建鏈接重置密碼的最佳做法?

任何人都可以建議如何做到這一點?哪些是最佳做法?

問候,卓然

+1

MD5不是 「加密」,這是* *散列。 MD5也不是很好的哈希。 – deceze 2012-08-10 09:54:00

回答

1

在是相當獨特的,並且是隨機生成的令牌字符串(相當長的)數據庫流行的一列。當用戶請求重置密碼時,請在電子郵件中發送該令牌以進行驗證。通過鏈接返回該令牌(aka GET)將確認用戶有權訪問該電子郵件地址,並允許他們重置密碼。

2

你應該發送一封電子郵件,使用mail()並添加到db一個散列隨機字符串。電子郵件應該包含一個鏈接,如「domain.com/forgot.php?h=HASHEDSTRING」。在該頁面中,您應該檢查哪個用戶擁有該散列字符串並輸出一個字段供他們重置密碼。

0

你可以做如下,

  1. 如果用戶忘記了自己的密碼,允許他進入與註冊郵箱。

  2. 發送一封電子郵件,重置密碼鏈接和鏈接應包含MD5(部分數據) 例如:www.ex.com/md5_data

  3. 發送郵件進入檢查電子郵件出現之前,如果存在取用戶ID,存儲用戶ID,md5(數據),你正在郵件發送

  4. 當用戶點擊鏈接發送到郵件獲取網址數據,並檢查是否存在您的表中的MD5數據,如果存在獲取用戶ID並允許他使用用戶ID設置新密碼和更新密碼,並從表中刪除md5數據,所以如果他再次點擊鏈接,它不應該工作。

1

辦理密碼重置可能看起來像這樣的安全方式:

密碼重設要求:

  1. 用戶打開密碼重置申請表,並進入電子郵件地址。
  2. 您的應用程序將檢查電子郵件是否存在於您的數據庫中。如果它存在,它會創建一個令牌,該令牌應該是隨機的,並且不會從諸如userid或timestamp之類的信息中獲取。 令牌的散列將存儲在數據庫中的一個單獨的表中,以及用戶標識和到期日期。與原始令牌的鏈接將通過電子郵件發送給用戶。
  3. 應用程序顯示電子郵件已發送的確認。此頁面可以包含電子郵件地址,因此用戶可以檢查他是否有打字錯誤(畢竟沒有關於電子郵件是否在數據庫中的信息,因此攻擊者無法測試它的存在)。

密碼重置:

  1. 用戶點擊該鏈接並打開復位形式。在這個表格上,他可以輸入兩次新密碼。令牌必須作爲隱藏的輸入標籤包含在表單中。
  2. 提交表單後,應用程序散列數據庫中的這樣一個令牌的散列令牌和搜索。如果匹配且未過期,則可以允許用戶更改密碼。最後,令牌應該標記爲已使用,我自己喜歡保持條目,所以我可以告訴令牌已經使用的用戶,當他再次單擊該鏈接。

您可以使用像SHA512這樣的散列算法對沒有鹽的散列進行散列。這是安全的,如果令牌是非常強(最小長度20 0-9 A-Z A-Z)。理論上你必須檢查你輸入數據庫之前,在實踐中,這是可以忽略不計,例如哈希是否已經存在。

+0

UPPS,我剛纔已經意識到這是一個古老的線程。 – martinstoeckli 2015-07-07 20:18:45

+0

欣賞此答案中的細節和清晰度。謝謝。 – Mina 2015-12-31 13:30:41