2011-01-09 125 views
0

可能重複:
PHP:How to send the original password to the user when he clicks forgot password which is encrypted by using md5?如何解密的MD5哈希

我已創建一個登錄名和PHP中註冊系統,我想打一個忘記密碼鏈接從找回密碼數據庫。我如何做到這一點?

注:使用MD5哈希encryted

+4

http://qdb.us/303622 –

+1

相當不錯的壓縮確實:-) –

+0

@Martin - 我認爲這是一個很好的問題。這傢伙顯然知道今天有關md5加密的重要事情。 – jmort253

回答

13

MD5是一個密碼散列,而不是一個加密方案。它不能以任何直接的方式逆轉。它只能通過嘗試可能的密碼來蠻力,直到找到匹配的密碼。這不被推薦。

您無法合理恢復密碼。您忘記的密碼鏈接應該重置密碼。

這是故意和好的設計。 MD5用於對密碼進行散列,以便如果密碼數據庫應該被黑客入侵,黑客只能訪問密碼的哈希值而不是原始密碼,這使得他們難以發現用戶的密碼。

然而,在這一點上,MD5破解已經得到了足夠快,它不推薦用於密碼。將來,應該使用scrypt或bcrypt作爲密碼哈希函數。

4

MD5在數據庫中的密碼是一種方法。您不能反轉md5加密的字符串。

通常,當提供忘記密碼鏈接重設用戶密碼的東西隨機開發商會做什麼,把那個給他們的電子郵件,然後迫使他們在下次登錄時重置其密碼。

另一個解決方案是爲他們提供了一個隨機密鑰和「忘記密碼鏈接」,可以用來讓他們重設密碼。

萬一你正在考慮的話,我想提一提,它是不以純文本的數據庫存儲密碼是個好主意。您無法檢索用戶密碼的事實意味着黑客也不能。

+0

那麼我該如何創建忘記密碼的應用程序? – dramasea

+0

我也想指出,當數據庫被黑客入侵時,黑客也會抓住關鍵字。接下來,編寫一個程序來生成隨機密碼,用於對付哈希,直到匹配爲止。因此,您的密碼越複雜,在您的帳戶遭到入侵之前需要的時間越長。 – Maarek

3

如果用戶忘記密碼,則不應將密碼發送給他們。相反,他們需要在驗證後(可能通過收到電子郵件或其他方式)重置密碼,確實他們確實是正確的用戶。

5

有密碼的哈希的全部意義在於,它是不可能從散列恢復原始密碼。這樣,如果有人盜用密碼數據庫並竊取所有散列,他們將無法恢復所有用戶的密碼。事實上,這在數學上是不可能的。散列函數將所有無限多個可能的字符串映射到一組固定長度的字符串,因此存在(理想情況下)無限多的散列到任何特定散列值的字符串。

如果你想要做一個「忘記密碼?」選項,最好將用戶的密碼重置爲隨機,然後發送包含新垃圾密碼的電子郵件。

4

雖然其他海報是正確的,我認爲一個具體的答案正在尋求所以在這裏。

忘記密碼功能可以通過使用與用戶ID相關的兩列來實現。一列是一個隨機字符串,可以是任意長度的,也可以是其他日期時間。當用戶指出他們忘記了密碼時,您將生成隨機字符串並使用字符串和當前日期時間更新此記錄。然後您會發送一封電子郵件至其註冊的電子郵件ID,並帶有隨機字符串。打開該URL後,您將檢查表中是否存在隨機字符串,以及該字符串是否已過期。您將檢查當前的日期時間和字符串生成的日期時間,並且您將擁有自己的策略來確定您將等待的最長時間。通常3天就夠了。如果鏈接過期,忘記的密碼將不得不重新開始。如果鏈接未過期,則會記下生成該字符串的用戶標識,並要求用戶輸入兩次用戶名和新密碼。用戶名必須與生成字符串的用戶名相匹配,且兩個密碼相同。您將使用新密碼的md5散列更新用戶密碼。

您不想生成新密碼的原因是因爲如果用戶撤回密碼,即使他們忘記了密碼,他們仍然可以登錄。