2011-01-10 124 views
0

好的,所以我正在學習php,html和mysql來學習網站開發(爲了好玩)。我還沒有得到的一件事是如何使用md5或sha1哈希。我知道如何散列純文本,但說我想做一個登錄頁面。由於密碼被散列且無法顛倒,因此mysql如何知道用戶插入的密碼與數據庫中的散列密碼相匹配?這裏是我的意思是:如何使用md5散列?

$password = md5($_POST['password']); 
$query = ("INSERT INTO `users`.`data` (`password`) VALUES ('$password')"); 

我知道這個片斷腳本的散列密碼,但我怎麼會用這一段代碼,讓一個登錄頁面?任何工作示例都會很棒。

這裏是我的腳本:

<?php 

session_start(); 

include("mainmenu.php"); 

$usrname = mysql_real_escape_string($_POST['usrname']); 
$password = md5($_POST['password']); 

$con = mysql_connect("localhost", "root", "[email protected]"); 

if (!$con) {  
    die(mysql_error()); } 

mysql_select_db("users", $con) or die(mysql_error()); 

$login = "SELECT * FROM `data` WHERE (`usrname` = '$usrname' AND `password` = '$password')"; 

$result = mysql_query($login); 


if (mysql_num_rows($result) == 1) {  

$_SESSION['logged_in'] = true; 
    header('Location: indexlogin.php'); 

exit; 

} 

else {  
echo "Wrong username or password."; 

} 

?> 

但我仍然得到else語句,「錯誤的用戶名或密碼,有人幫助PLZ!」

+0

看起來相關:http://stackoverflow.com/questions/4642376/trouble-making-login-page – thirtydot 2011-01-10 01:49:37

+0

*使用sha1散列*的MD5?我猜你是指*或*? – 2011-01-10 01:54:37

+0

@thirtydot如果沒有最小字符數,我會直接寫「lol」 – Ken 2011-01-10 02:08:07

回答

0

它散列密碼,所以它不以明文 保存如mylongpassword成爲9a995d3f6a3d69c1a9b4344bed4f2c87

使用從($ _ POST ['密碼DB頭

$password_from_db = Select * from user where username='".$_POST['username']."' 

然後密碼選擇哈希密碼'])應該首先在PHP中進行散列處理,然後與存儲在數據庫中的值進行比較

<?  
    if (md5($_POST['password'])==$password_from_db){ 
     return true; 
    }else{ 
     return false; 
    } 
?> 
+0

我知道 - 但我怎麼會採取散列,並使其當用戶輸入「mylongpassword」數據庫可以檢索並識別「mylongpassword」,並能夠登錄他們? arggh ...它很難解釋... – Ken 2011-01-10 01:51:34

0

而不是插入進入SQL數據庫,將一些查詢分配給一個變量,並根據用戶給定的md5進行檢查。

1

請使用SHA1/256。 MD5的密碼不再安全,因此不宜將其用於密碼學(對於文件哈希ETC而言,這很好)。

我不張貼代碼,但解釋的技術:

首先,在登記,乘坐SHA1/256散列密碼,並將其存儲在數據庫中。用戶下一次登錄時,將再次輸入他/她輸入的密碼的SHA1/256哈希值,並將其與存儲在數據庫中的哈希值進行匹配。這是有效的,因爲密碼的SHA1散列是半獨特的(重複的機會很小)。

1

答案很簡單:你在數據庫中有一個散列,所以你需要散列用戶提供的密碼來比較它們。

所以,當用戶嘗試登錄時,你需要$_POST['password']或其他什麼,並創建它的散列。然後,你只需查詢數據庫的散列,我也建議你閱讀更多關於密碼安全存儲的內容。例如,這是一個很好的開始:You're probably storing passwords incorrectly - Coding Horror

0

當用戶試圖使用他們的密碼登錄時,您將他們輸入的md5與您已經存儲在數據庫中的內容進行比較。如果它匹配,你就知道他們輸入了正確的密碼。

0

編輯 您的代碼似乎沒問題。 檢查數據庫中您的密碼字段是否至少有32個字符。 並嘗試在phpMyAdmin中執行此查詢(將變量更改爲實際字符串),如果使用的話。

0

您也有一個主要的加密問題。

$password = md5($_POST['password']); 

的問題存在,所有使用相同密碼的人都會有相同的哈希值,所以如果(何時?)有人進入你的網站,他們運行一個字典攻擊,然後將哈希從攻擊比較數據庫中的哈希。因此,他們打破了您網站上的每一個帳戶的成本與打破一個帳戶的成本基本相同。

在最起碼,你應該鹽呢,是這樣的:

$password = md5($_POST['user'] + $_POST['password']); 

但是,即便是有驚人的弱點,所以最好哈希兩次,也許是這樣的:

$password = md5($_POST['password'] + md5($_POST['password'] + $_POST['user'])); 

當然,最好的辦法就是使用某人寫的東西,這個人比我知道的更多地瞭解加密技術:)

(並且記住你的authenticat中的壞parf離子系統是一個特點。)