2012-12-16 100 views
4

我目前工作的一個學校項目,我已經最近做了努力完成了登錄授權沒有任何進展。我正在使用HASH和SALT來註冊新用戶。我找不到任何資源來支持我,所以我決定在這裏寫一個帳戶來問我自己的問題。登錄授權,如何檢查,如果密碼匹配鹽+哈希 - PHP + MySQL的

這是我的註冊腳本:

$username = $_POST['username']; 
    $email = $_POST['email']; 
    $first = $_POST['fname']; 
    $last = $_POST['lname']; 
    $salt = crypt("sha512", false); 
    $pass = $_POST['password']; 
    $password = hash("sha512", $salt . $pass . $salt, false); 

$sql = "INSERT INTO `users` (`username`, `email`, `fname`, `lname`, `salt`, `password`) VALUES ('$username', '$email', '$first', '$last', '$salt', '$password')"; 

然後,我有一個checklogin.php腳本這是我的索引頁面上行動=「checklogin.php」,這是在登錄頁面。這是完整的腳本:http://pastebin.com/tKrsHaFU(貼bin)

我的問題是我如何驗證我的用戶來到index.php頁面(登錄表單)與已經在數據庫中的用戶請記住我有一個鹽和哈希密碼。

+1

做bcrypt搜索代替。 –

回答

5

首先:

$salt = crypt("sha512", false); 

即產生靜態的鹽,即,沒有變化。爲了產生更好的一個:

$salt = uniqid(mt_rand(), true); // the paranoid use openssl_random_pseudo_bytes() 

爲了驗證記錄,您的SQL變爲:

$sql="SELECT * FROM $tbl_name WHERE username='$myusername'"; 
$result=mysql_query($sql); 
// ... 
if ($count==1) { 
    $row = mysql_fetch_assoc($result); 
    if (hash('sha512', $row['salt'] . $_POST['mypassword'] . $row['salt']) == $row['password']) { 
     // validation passed, rejoice! 
    } 
} 

但是,你應該看看這裏:How do you use bcrypt for hashing passwords in PHP?

0

你不用擔心這麼多!

現在後面的任何登錄腳本,也落後數據庫,存儲用戶信息的基本想法是,我們需要至少1倍的值是一個主鍵,將唯一標識每個用戶。 現在在你的情況下,它的username似乎是主要關鍵。

因此,所有你需要做的就是簡單地執行$data = mysql_query("SELECT * FROM table_name") or die(mysql_error());

這裏table_name將存儲所有的用戶信息表的名稱。 現在一個$info = mysql_fetch_array($data);將把所有的用戶信息放入一個數組中。

一個簡單的var_dump($info)將列出你所有的用戶名與用戶的其他信息一樣(只要爲了測試而...üDONOT想在註冊時顯示DIS信息給用戶:P)通過

只是循環此數組並將new_user提供的用戶名與陣列中已存在的用戶名匹配。如果匹配,那麼你可以通過說User already exists !!來阻止他。 Else歡迎他到您的網站。

0

請看看你是否可以閱讀這篇文章。它顯示了一般的設計模式。 http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_2391-PHP-login-logout-and-easy-access-control.html

如果你可以得到這麼多的工作,下一步將是模糊你的數據庫中的密碼。您可以使用php md5()對密碼進行單向編碼。當客戶端註冊並存儲編碼密碼時,將md5()應用於密碼。將md5()應用於客戶端輸入登錄表單的明文密碼。在您的SELECT查詢中使用編碼密碼。您可以將salt字符串連接到md5()函數調用中。只要確保每次都使用相同的鹽。

http://php.net/manual/en/function.md5.php

此致〜雷

+0

現在是時候換另一個散列函數了,MD5是不好的!像Jack說的那樣檢查bcrypt。 –

+0

我總是聽到關於md5的這種愚蠢行爲。它很簡單,易於使用,非常難以打破。如果有人想嘗試打破它,我會給你買一瓶啤酒。只要告訴我與此字符串匹配的密碼:e0f1299ed629d3c8826e2dd2be4780cf –

+0

@Ray Paseur - 所以我們再次見面,只是告訴我這個MD5哈希的密碼:736417aff94df6884ea929e7014816a2,如果你認爲它是安全的,那麼問[Google](http:// www.google.ch/#q=736417aff94df6884ea929e7014816a2)... – martinstoeckli