2016-12-06 107 views
0

首先,我對編碼一般都比較陌生,所以散列思想有點混亂。本質上,我試圖散列一個密碼,以便將其存儲在數據庫中,所以我沒有明文密碼(我被告知這是做到這一點的最佳方式,儘管我不認爲這會是如果密碼未被散列,這是一個大問題,因爲這只是在一小羣人中使用,我可以通知他們不要使用他們關心的密碼,但我仍被建議這樣做)。PHP和SQL散列幫助:我做錯了什麼?

我查了一些指南,可以用一些幫助瞭解這一點。我將包括我對密碼進行哈希處理的方式,以及如何將它們從數據庫中提取出來以幫助理解此問題。如果這是一個愚蠢的問題,提前道歉。只是站起來,我不太明白這是我問這個問題的原因。

注:包括變量,如$ login_username和$ login_password被拉到正確的,我只是不想包括他們,因爲這將更加凌亂後的這個爛攤子。

註冊用戶(試圖password_default和password_bcrypt,但我看不出有差別):

require_once 'database.php'; 
    $hash_employee_password = password_hash($employee_password, PASSWORD_DEFAULT); 

    $query = "INSERT INTO employee 
       (employee_id, employee_first_name, employee_last_name, 
       employee_username, employee_email, employee_password) 
       VALUES 
       (:employee_id, :employee_first_name, :employee_last_name, 
       :employee_username, :employee_email, :employee_password);"; 

    //VALUES (".$employee_id.", '" . $employee_first_name."', '" . $employee_last_name . "', '".$employee_username."', '".$employee_email."', '" . "$employee_password');"; 

    $statement = $db->prepare($query); 
    $statement->bindValue(':employee_id', $employee_id); 
    $statement->bindValue(':employee_first_name', $employee_first_name); 
    $statement->bindValue(':employee_last_name', $employee_last_name); 
    $statement->bindValue(':employee_username', $employee_username); 
    $statement->bindValue(':employee_password', $hash_employee_password); 
    $statement->bindValue(':employee_email', $employee_email); 
    $statement->execute(); 
    $statement->closeCursor(); 

    //echo $query; 
    $message = 'You have been successfully registered. Contact your manager in order to request account confirmation.'; 
    include ('success.php'); 

記錄登錄:

require_once 'database.php'; 
include 'register_user.php'; 

$pwordQuery = "SELECT employee_password from employee where employee_username = :login_username"; 
$pwstatement = $db->prepare($pwordQuery); 
$pwstatement->bindValue(':login_username', $login_username); 
$pwstatement->execute(); 
$result = $pwstatement->fetch(); 
$pwstatement->closeCursor(); 


echo $result[0]; 

if(password_verify($login_password, $result[0])) 
{ 
    echo ' TRUE'; 
} 
else 
{ 
    echo ' FALSE '; 
} 

的問題是:我輸入正確的用戶名和密碼,但得到「FALSE」的結果迴應出來。如果您有任何想法,請告知我。忽視這樣的事實,即我有很多工作要做,比如將我的查詢變成功能,並以這種方式調用它們......這是爲了以後的保存。

+2

''如果密碼沒有被散列,我不認爲這會是一個大問題,因爲這只是在一小羣人中使用,我可以通知他們不要使用他們關心的密碼「 - 我讀到這樣的話:」如果我能告訴其他人預期我做錯了事,我認爲我不應該做正確的事情。「 – David

+0

'$ login_password'是實際密碼還是哈希值? – Maximus2012

+3

密碼欄的長度是什麼?如果它小於60,那麼mysql默默地對你失敗。 10次​​中有9次,這就是問題所在。如果是這樣,那麼你需要重新開始清理你的數據庫並創建一個新的散列。 –

回答

1

「密碼欄的長度是多少?如果它是任何低於60時,MySQL對你默默的失敗。9次了10年,這就是問題所在。如果是這樣,那麼你就需要開始所有再次通過清除您的數據庫,並創建一個新的哈希 - 弗雷德-ii- 13分鐘前」

,我是對的所有沿。

@Fred那麼它看起來就像列長度​​是45是一個壞主意,那是我唯一的問題。感謝您的幫助,不能完全肯定這是如何站點工作,所以我不知道怎麼給你代表什麼的「

按照手冊上的password_hash()功能:

http://php.net/manual/en/function.password-hash.php

PASSWORD_DEFAULT - 使用bcrypt算法(默認爲PHP 5.5.0)。注意,這個常量被設計爲隨着時間的推移而變化,因爲新的和更強大的算法被添加到PHP中,因此,使用這個標識符可以隨時間變化,因此,建議將結果存儲在可擴展超過60個字符的數據庫列中(255個字符將是一個不錯的選擇)。

+0

感謝您的幫助,一定錯過了關於字符長度的部分...對不起,如果這看起來像一個糟糕的問題,正如我所說,我是新的:/ – cierex

+1

@cierex你是最歡迎。很高興看到您也正在使用準備好的聲明。 –

+0

downvote,真的嗎? *大聲笑* –