2016-04-23 54 views
1

最近我創建了一個處理我的遊戲的登錄和註冊的腳本,它使用http_get方法更新統計信息。我已經成功地創造了一切,但有一個問題。當用戶註冊時,它會插入不同的php腳本生成的md5字符串,因此我無法比較密碼。在SQL數據庫和PHP腳本中作用不同的MD5

這是我插入的MD5字符串轉換成數據庫的方式:

$pw = md5($password); 
    $insert = mysqli_query($connect, "INSERT INTO Accounts (username, password, email,reg_ip, wins, looses, experience) VALUES ('$username', '$pw', '$email', '$reg_ip', '0','0', '0')"); 
    if($insert) { 
      echo "account successfully created"; 

     } 
     else { 
      echo "error"; 
     } 

這是我檢查密碼方式:

if($p['password'] == md5($password)) { 
       echo "login was successful!"; 
      } 
      else { 
       echo "incorrect password"; 
      } 

這是MD5字符串,它是在數據庫當用戶註冊時:(未加密的字符串是:pocakaj123)

54e8850ba5eca655854ddf1b503943 

這是生成的字符串當我回聲MD5($密碼)。

54e8850ba5eca655854ddf1b50394348 

在此先感謝,所有的答案都非常感謝!

+1

爲什麼其中一個只有30個字符? MD5的十六進制是32個字符。 –

+2

你不應該使用'md5'來存儲你的密碼,所以這個問題是無關緊要的。 –

+0

請參閱:[如何安全存儲用戶的密碼](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016)。 –

回答

6

這是由於您的數據庫中的字段長度所致。您需要增加長度,以便整個字符串可以適合。

目前,它僅接受30個字符,因此剩下的被截斷:

54e8850ba5eca655854ddf1b503943 

你需要增加長度,至少32個,以適應整個字符串:

54e8850ba5eca655854ddf1b50394348 

備註:

md5()不是一個安全的哈希密碼方式,更好的方法是bcrypt()或者改爲使用PHP的密碼哈希函數,password_hash()

原因是md5()不安全:

散列算法,如MD5,SHA1和SHA256都設計得非常快速,高效。使用現代技術和計算機設備,爲了確定原始輸入,將這些算法的輸出「暴力」變得微不足道。

引用自http://php.net/manual/en/faq.passwords.php

+3

這是正確的答案。但是,還需要注意的是,這不是一種安全的存儲密碼的方式。 MD5壞了。 OP應該使用bcrypt,而不是滾動他自己的散列解決方案。 –

+0

@EdCottrell True,將更新帖子添加此提示,謝謝指出! – Panda

+0

@BorutMatjasic也許接受這個答案,如果它幫助你?謝謝! – Panda