2013-05-19 68 views
0

我有一個註冊頁面,允許用戶插入密碼。我在註冊時散列密碼,以便它更安全地存儲在數據庫中。註冊密碼與登錄密碼不同

當用戶使用相同的密碼登錄,這兩個散列不匹配,而且用戶無法登錄

這是使用哈希我的第一次,並沒有表現得如我所料:

這是註冊頁面上的散列碼:

$salt ="";  
function cryptPass($input, $rounds = 9) 
{ 
    $salt = ""; 
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9')); 
    for($i = 0; $i<22; $i++) 
    { 
     $salt .=$saltChars[array_rand($saltChars)]; 
    } 
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt); 
} 
$hashedpass = cryptPass($pass1);  
echo $hashedpass; 
//************Insert all the members's input to the database**************************// 
     $query = mysql_query("INSERT INTO members(user_name, first_name, last_name, governorate, district, village, birth_date, email_address, specialization, password, salt, registered_date)VALUES('$username', '$firstname', '$lastname', '$governorate', '$district', '$village', '$bdate', '$email', '$specialization', '$hashedpass', '$salt', now())")or die(mysql_error());  

我沒有加入鹽,但它給空

這是登錄頁面

function cryptPass($input, $rounds = 9) 
{ 
    $salt = ""; 
    $saltChars = array_merge(range('A','Z'), range('a','z'), range('0','9')); 
    for($i = 0; $i<22; $i++) 
    { 
     $salt .=$saltChars[array_rand($saltChars)]; 
    } 
    return crypt($input, sprintf('$2y$%02d$test$', $rounds) . $salt); 
} 
$hashedpass = cryptPass($pass); 
echo $hashedpass; 


$sql=mysql_query("SELECT user_id, email_address, first_name, user_name FROM members WHERE email_address='$email'AND password= '$hashedpass' LIMIT 1") or die("error in members table"); 
$login_check = mysql_num_rows($sql); 

    if($login_check > 0)the hashing password = $2y$09$test$4ZGgCiXdKzgQvuzwu.AxfdWvZadDCE.LD6HCkrK3ZsqJeN7e 

回答

0

您需要的鹽,存儲在數據庫中,與哈希密碼一起上的哈希碼。

當用戶嘗試登錄時,您需要從數據庫中獲取salt,並用它對用戶輸入進行散列,以便將其與散列密碼進行比較。

在您的示例中,您將在登錄過程中生成一個隨機salt,它永遠不會產生與您的數據庫中相同的哈希值。

+0

所以在我的例子中它應該是什麼代碼,因爲它沒有工作,因爲它應該 – user2398286

+0

當用戶註冊時,你生成一個鹽,並用它散列密碼。然後將這兩個密碼保存到數據庫中。當用戶嘗試登錄時,首先要做的是獲取用戶的信息。一旦你有了他的鹽,你可以用數據庫中的salt來散列用戶輸入的密碼。然後,您可以將生成的哈希與數據庫中的哈希進行比較。 – Ahatius

+0

問題是我不明白你的意思是通過獲取用戶的鹽(在代碼中我不知道該寫什麼) – user2398286

1

當用戶註冊時,您需要在數據庫中存儲salt和哈希密碼。當用戶嘗試登錄時,您需要使用相同的鹽和註冊時相同,否則散列值將會不同。這被稱爲每用戶鹽,並且是更安全的選項。

更簡單但安全性較低的選項是爲應用程序生成單個salt值並將其用於所有用戶。這將會使所有密碼在數據庫中散列化,但安全性要差得多,因爲如果鹽值被破壞,暴力破解密碼是一件微不足道的事情。

0

如果您要自己編寫它,您需要將生成的鹽保存在數據庫中(如其他響應者所述)。更一般地說,我會嘗試儘可能地委託給一個提供密碼支持的外部庫。正確獲取加密是困難的,在開始自己開始滾動之前,你確實需要多讀一些。那裏有很好的圖書館支持。你應該使用它。

此外,你真的不應該使用MD5散列密碼。使用bcrypt,pbkdf2或其他適合密碼的散列。只需使用圖書館。

0

密碼salting通過在散列之前將一個預定義的明文隨機集附加到密碼中起作用。這避免了兩個用戶選擇了相同的密碼的兩個相同的哈希值。想象一下你的系統的兩個用戶,user1和user2,選擇「letmein」作爲密碼:

salt_user1 = 'awoidjalskdm' 
hash = MD5('letmein'+salt_user1) = ab82a9c495e3fe88d1986176e4850b1d 

和user2的

salt_user2 = 'duiesnblekfn' 
hash = MD5('letmein'+salt_user2) = 69caac44b5ee9f8b6468b5625000723a 

假設你的數據庫結構是沿用戶名線的東西: salt:password_hash,你會得到:

user1:awoidjalskdm:ab82a9c495e3fe88d1986176e4850b1d 
user2:duiesnblekfn:69caac44b5ee9f8b6468b5625000723a 

密碼salting的主要目的是爲了避免大量的密碼泄露,如果你r數據庫受到威脅。密碼醃製會使強制簡單和流行的由多個不同用戶選擇的密碼變得更加困難。

在你的情況,它似乎是隨機生成鹽註冊(這是很好)。這個錯誤似乎是在登錄函數中,你重新計算一個隨機鹽,而不是檢索先前已經生成並且應該已經存儲的鹽。

在哈希化之前,您要添加密碼的salt對於每個用戶而言都需要相同,並且您需要在需要時能夠調用它。儘管看起來可能矛盾,但這意味着它必須以明文形式存儲在數據庫中。

相關問題