2016-03-05 73 views
0

因此,我剛剛瞭解到使用MD5哈希和鹽在PHP/MySQL中存儲密碼。我使用的方法是md5(md5($row["id"].$password)),所以salt是在我的SQL表(這是一個自動遞增的INT)中的用戶ID的MD5哈希,它與輸入的密碼字符串連接,然後重新哈希。比較MD5哈希密碼不起作用

我遇到的問題是,當我嘗試創建測試帳戶,然後使用測試帳戶登錄時,我在登錄時生成的哈希與我在創建帳戶時創建的哈希不匹配。

登錄代碼:

<?php 

$login = mysqli_connect("hiding this info for obvious reasons"); 

if ($_POST["login"]) 
{ 

    $email = $_POST["email"]; 
    $password = $_POST["passsword"]; 

    $query = "SELECT * FROM useraccs WHERE email='$email'"; 

    if ($result = mysqli_fetch_array(mysqli_query($login,$query))) 
    { 
     $hashpass = md5(md5($result["id"]).$password); 

     if ($hashpass == $result["password"]) 
     { 

      $errors = "Logged in succesfully."; 

     } 

    } 
    else 
    { 
     $error.= "E-mail/Password do not match anything in our database."; 
    } 

} 

?> 

註冊編號:

<?php 

$login = mysqli_connect("hiding this info for obvious reasons"); 

if ($_POST["submit"]) 
{ 

    $username = $_POST["username"]; 
    $email = $_POST["email"]; 

    $query = "INSERT INTO useraccs (username,email) values('$username','$email')"; 

    mysqli_query($login,$query); 

    $query = "SELECT id FROM useraccs WHERE username='$username'"; 

    $userid = mysqli_fetch_array(mysqli_query($login,$query))["id"]; 

    $password = md5(md5($userid).$_POST["password"]); 

    $query = "UPDATE useraccs SET password='$password' WHERE username='$username'"; 

    mysqli_query($login,$query); 

} 

?> 

正如你所看到的,這樣我湊在這兩種情況下,密碼是相同的,我做了測試,以確認我我在兩種情況下都獲得了相同的ID值。我真的很難爲什麼我沒有得到一場比賽。

我想提一下,我對使用MySQL /創建登錄系統非常陌生,所以如果我做了任何明顯錯誤的或者遺漏了重要信息,請告訴我。

+5

現在是2016年,你爲什麼使用md5作爲密碼? –

+3

**危險**:您很容易受到[SQL注入攻擊](http://bobby-tables.com/)**,您需要[防禦](http://stackoverflow.com/questions/) 60174/best-way-to-prevent-sql -injection-in-php)自己從。 – Quentin

+4

**危險**:您正在使用[不適合的哈希算法](http://php.net/manual/en/faq.passwords.php)並需要[更好地保護](https:// www。 owasp.org/index.php/Password_Storage_Cheat_Sheet)的用戶密碼。 – Quentin

回答

0

首先,請參閱評論中的警告,您的代碼非常不確定。

關於MD5:您正在使用

mysqli_fetch_array(mysqli_query($login,$query))["id"]; 

這將始終返回數組。一定要只拿到領域。