2010-12-31 11 views
1

私はこの1つで私の髪を引っ張っています。私は、ハッシュされた塩漬けのパスワードと関連する塩をMySQLデータベースに保存しています。これはログインスクリプトのためのものです。データを保存すると、dbのCHAR(128)型に格納されたデータが正常に動作します。ハッシュされた文字列を比較する

ただし、パスワード文字列とログインフォームのハッシュされたログインパスワードが正常に一致しない場合。私は基本的にすべてを取り除きましたが、出力(echoまたはvar_dump)が同じに見えてもまだ一致しません。ここで

は、レジスタのコードスニペットです:ここで

$_POST['dk_username'] = mysql_real_escape_string($_POST['dk_username']); 
$_POST['dk_password'] = mysql_real_escape_string($_POST['dk_password']); 
$username = stripslashes($_POST['dk_username']); 
$password = stripslashes($_POST['dk_password']); 

$salt = uniqid(mt_rand()); 
$newhash= $salt . $password; 
$hashPass= hash('sha512', $newhash); 

$email=$_POST['email']; 

$sql="INSERT INTO users (uName,uPass2,uEmail,uSalt,uID) 
VALUES ('$username','$hashPass','$email', '$salt', 'time()')"; 

mysql_query($sql) or die('Error, insert query failed'); 

は、ログインスニペットです:ログイン用の

$_POST['dk_username'] = mysql_real_escape_string($_POST['dk_username']); 
$_POST['dk_password'] = mysql_real_escape_string($_POST['dk_password']); 
$username = stripslashes($_POST['dk_username']); 
$password = stripslashes($_POST['dk_password']); 


$query = "SELECT uID, uPass2, uSalt, uName FROM users WHERE uName = '$username';"; 
$result = mysql_query($query); 
if(mysql_num_rows($result) < 1) //no such user exists 
{  echo 'Wrong username and/or password!'; 
} 
$userData = mysql_fetch_array($result, MYSQL_ASSOC); 
$salt=$userData['uSalt']; 
$newhash= $salt . $password; 
$hashPass= hash('sha512', $newhash); 
$tempData=strcmp($hashpass, $userData['uPass2']); 
if(hashPass != $userData['uPass2']){ 
echo "password not correct:<br/>"; 
echo "db: " . var_dump($userData['uPass2']) . "<br />"; 
echo "in: " . var_dump($hashPass) . "<br />; 
echo $tempData . "<BR />"; 

}else{ 
echo "logged in"; 
} 

結果:

password not correct: 
string(128) "98f713244f3d97e8629222f8d37e3cad38c5c1e2fbf011c135723f36b7841ef29785b1866ac6dbab9cd044b12db8e4d16a4c68df1e3d7b8f4a27a8c3d4c9bca5" db: 
string(128) "98f713244f3d97e8629222f8d37e3cad38c5c1e2fbf011c135723f36b7841ef29785b1866ac6dbab9cd044b12db8e4d16a4c68df1e3d7b8f4a27a8c3d4c9bca5" in: 
-128 

答えて

3

あなた$$hashPassのためにここに欠落しています。

if(hashPass != $userData['uPass2']){ 

現在は(定数が定義されていない場合は、文字列'hashPass'としてのPHP扱い)PHPがhashPassと呼ばれる定数で$userData['uPass2']を比較するために引き起こしています。

error_reportingE_NOTICEを含めると、PHPは「定数」に関する通知を鳴らすことになります。