2012-10-16 55 views
0

所以我一直在學習相當多的關於PHP和Mysql,並且我在想什麼。比方說,我打算建立一個只存儲用戶名和密碼的數據庫(保持例子簡單)。我知道存儲密碼而不加密它們是不安全的,因爲有人可能侵入數據庫。
因此,我使用MD5哈希或更安全的內容並存儲加密的密碼,然後我的用戶之一忘記了他們的登錄信息,他們想通過電子郵件檢索它。存儲用戶名和密碼,然後用戶想要檢索用戶信息,但密碼是加密的

如果我使用的是單向加密方法,比如MD5或更好的加密方法,那麼如果用戶的密碼被加密並且無法解密,我該如何向用戶發送他們的登錄信息?
我猜想爲此目的(我的意思是檢索部分)是否有另一種方式,或至少另一個地方,密碼存儲在這裏嗎?

如果有人能夠安全地存儲這些信息,我會很高興,但如果我的一個用戶忘記了他們的登錄信息,我就有辦法讓他們安全地發回郵件。 或者現在這樣的問題如何處理?
從我讀到的MD5哈希已被黑客入侵,所以更好的加密哈希或方法也不錯。

+2

簡單的經驗法則。如果你可以解密它發送給用戶 - 黑客可以 – BugFinder

+0

這就是爲什麼我正在尋找一個好方法來保持信息的安全,但也處理白色問題。 –

+0

保持簡短,給他們一個唯一的電子郵件鏈接,然後讓他們重置它。沒有人需要知道實際密碼是什麼。 – itachi

回答

5

那麼我應該如何發送用戶的登錄信息,如果他們的密碼是加密的,沒有辦法解密它?

你不是。你永遠不應該發送用戶的密碼給他們。

如果用戶想要重置其密碼,然後:

  1. 生成隨機令牌
  2. 存儲在一個數據庫中帶有時間戳和用戶ID
  3. 電子郵件令牌的用戶令牌
  4. 當用戶使用該令牌訪問一個頁面,允許他們進入一個新的密碼
  5. 刪除令牌已經使用後
  6. 如果在一段時間內未使用令牌(例如3小時)

而且從我讀MD5哈希值已經被砍死這麼一個更好的加密哈希或方法將是不錯的。

參見the PHP manual, this is a FAQ

參見,OWASP

+0

啊,沒有真正看到它的方式謝謝你的幫助。 –

1

首先,不要使用MD5。閱讀這個問題,我前一段時間發佈,它包括很多有用的鏈接Improve password hashing with a random salt

然後,如果你散列用戶密碼(這是強烈推薦),你根本無法發回他們的密碼。向他們發送重置密碼鏈接並允許他們設置新密碼。它是如此簡單。

0

我想你會沿着正確的路線存儲密碼而不是密碼本身的散列。

如果他們忘記了它,我同意因爲你只有一個散列,所以你不能向他們展示一個帶有密碼的屏幕。不過你可以給他們發一封電子郵件,鏈接到一個頁面,允許他們通過重置他們的密碼。

0

你可以簡單地只需要創建一個隨機密碼,並將它們發送,將激活密碼激活鏈接。

我建議你使用md5以外的東西,或者使用帶鹽的md5或其他東西,因爲如果密碼太簡單,那麼有很多在線工具可以給你一個md5的字符串。順便說一下,鹽基本上是一組鍵,你會添加到密碼,使其更難獲得。

1

如果你可以很容易地解密密碼,然後其他人也可以這樣做,並且系統將確保

更好的方法是,通過使用一些隨機字符串生成在用戶請求時&更新密碼,新密碼併發送用戶更新(未加密)通過郵件密碼,並將其存儲在數據庫加密(例如MD5)後... 你可以用我下面的方法生成隨機密碼

<pre> 
    <?php 
    $randstr = ""; 
     for($i=0; $i<10; $i++) 
      { 
      $randnum = mt_rand(0,61); 
      if($randnum < 10) 
      $randstr .= chr($randnum+48); 
      else if($randnum < 36) 
        $randstr .= chr($randnum+55); 
      else 
        $randstr .= chr($randnum+61); 
      } 
    $original_pass=$randstr; //Send it via E-mail 
    $encrypted_pass=md5($randstr); //Store it in Database 
     ?> 

也可以在前三個字母上使用md5,在​​下兩個字母上使用sha1,在下一個字母上使用其他字母,並將用戶限制在至少6個字母以上的密碼 但是,有一些加密算法,你可以通過提供祕密密鑰將它們用於解密,但其他人知道祕密密鑰也會解密它們...

你也可以加密密鑰,然後將它存儲在數據庫中,並用它來通過其他密鑰解密密鑰後解密密碼.... 但它會增加處理時間,並會出現時間複雜性問題。