2013-03-20 82 views
1

我已經設法創建了一個基本的加密系統,因此當用戶最初註冊到我的網站時,密碼將安全地使用salt,md5和sha1存儲在我的數據庫中。登錄時使用salt和md5加密的問題

現在,用戶登錄時發生問題,即使我使用相同的方法,發送到數據庫的字符串(密碼)也不同。我將在下面演示:

這是我的基本(現在)使用鹽技術將客戶添加到數據庫頁面。

require "dbconn.php"; 

$username = $_GET['username']; 
$email = $_GET['email']; 
$pass = $_GET['pwd1']; 
$pass2 =$_GET['pwd2']; 
$matching = 0; 

if($pass == $pass2) 
{ 
echo "<script type='text/javascript'> window.alert('Your details have been successfully   registered, please proceed to login with your new credentials!')</script>"; 
echo '<script>javascript:window.close();</script>'; 

$salt = sha1(md5($pass)); 
$pass = md5($pass.$salt); 

$query = "INSERT INTO customer VALUES ('".$username."','".$email."','".$pass."','face1.jpg')"; 

再次,這是我的基本(現在)重新登錄使用相同的鹽技術頁面(我已經離開了這個頁面的後半部分)

session_start(); 
require "dbconn.php"; 

$username = $_GET['username']; 
$password = $_GET['password']; 

$salt = sha1(md5($password)); 
$password = md5($password.$salt); 

$sql = "SELECT * FROM customer WHERE username ='".$username."' AND password='".$password."'"; 

我已經做了一些檢查,當把一個密碼進入數據庫 例如使用密碼名測試:它被存儲爲34364c859afb02e70306c905374ac2但是當密碼的用戶登錄是:34364c859afb02e70306c905374ac2d5

+1

總是逃避用戶輸入!使用'mysql_real_escape_string()'來轉義它,否則任何人都可以利用你的網站! – MMM 2013-03-20 15:21:49

+0

看看[本頁](http://gnorman.org/index.php?option=com_content&view=article&id=238&Itemid=274)。也許你應該將數據類型改爲tinyblob。 – 2013-03-20 15:23:47

+2

檢查數據庫中字段的長度 – Curlas 2013-03-20 15:24:34

回答

4

有一噸的事情錯在這裏:

  1. 在URL字符串中不傳輸密碼(GET paramters),因爲這使得它可見,並可通過泄漏引薦來源網址的密碼。
  2. 使用準備好的語句。不要使用舊的mysql_ *函數。而是使用MySQLi或PDO。發送到數據庫中的任何參數都應該通過準備好的語句,其中兩個參數之一是在語句準備好之後注入參數。這使您可以使用MySQL驅動程序來轉義您的參數並防止SQL注入。
  3. 風格上你應該爲你的變量使用一致的名字。
  4. 檢查您的色譜柱長度。這可能太短了。 (2個字符丟失)
  5. 您的salting方法並不真正適用於salting方法,因爲它是從原始密碼字符串派生的。考慮爲每個用戶生成一個獨特的鹽。
+1

感謝您的時間,並給我一些指點。 – user2141414 2013-03-20 16:30:40

+0

@ user2141414沒問題! – hsanders 2013-03-20 19:53:51

1

你存儲哈希太短了MD5哈希 - 這是30 C字符長。

你很可能會修剪它。檢查你的字段的長度,它應該容納32個字符的散列。

+0

謝謝你的時間。親切的問候 – user2141414 2013-03-20 16:34:11

2

這裏存在幾個問題:

  1. 你不使用應原用戶輸入構建SQL查詢,您應該逃避它。我建議你使用PDO和準備好的語句。
  2. 散列/加密/存儲密碼的方式根本不安全。嘗試一下可以處理這個問題的PHP庫,它更安全。
  3. 在你的情況下,問題似乎是數據庫字段的長度。正如你所看到的,你提供的兩個哈希值幾乎是一樣的,除了第一個哈希值更短。你應該擴展你的數據庫密碼字段長度。
+0

感謝您的時間,並給我一些指點。親切的問候 – user2141414 2013-03-20 16:32:58

1

有2個字符遺漏你的字符串。

34364c859afb02e70306c905374ac2 
34364c859afb02e70306c905374ac2d5 

檢查你的mysql字段長度。

+0

感謝您的時間。親切的問候 – user2141414 2013-03-20 16:33:33