2016-08-09 3 views
-1

私はこの質問が何度も尋ねられ、このテーマに関するチュートリアルがたくさんあることを知っていますが、私が間違っていることを説明することはできません。私のコードで何が間違っているか教えてください。データベースの接続は正常に動作しますが、問題がどこにあるのかわからない場合や、パスワードをハッシュしないで直接問題がないときに間違ったことを理解していればわかりません。どんなエントリーであれ、私のログインはうまくいかず、常に「偽」を返します。

はここに私のコードですPHP MySQLのパスワードハッシュは常に偽を返す

public function insertUser(){ 
     if (isset($_POST['name']) && isset($_POST['password'])){ 
      try 
      { 
       $name = $_POST['name']; 
       $password = $_POST['password']; 

       $db = CDatabase::getInstance(); 
       //check if username is already in use 
       $db->prepare("SELECT * FROM user where LOWER(name) = LOWER(?)"); 
       $db->bindParams(array($name)); 
       $db->execute(); 

       $result = $db->fetch(); 
       //if no user with the same name was found 
       if ($result->num_rows == 0){ 
        //insert user without password 
        $db->prepare("INSERT INTO user (name) VALUES(?)"); 
        $db->bindParams(array($name)); 
        $db->execute(); 
        //get user_id of last inserted user because I use user_id as salt 
        //pls feel free to correct me if this is stupid 
        $user_id = $db->getLastInsertedId(); 
        $salt = $user_id; 
        //hash password with user_id 
        $saltedHash = hash('sha256', $password, $salt); 
        var_dump($saltedHash); 

        //update user with password 
        $db->prepare("UPDATE user set password = ? where user_id = ?"); 
        $db->bindParams(array($saltedHash, $user_id)); 
        $db->execute(); 
        //since I call this function via ajax true -> user is inserted correct 
        echo "true"; 
       }else{ 
        echo "Error: name is already in use"; 
       } 
      } 
      catch(Exception $e) 
      { 
       $this->m_renderer->loadTemplate('error.html'); 
       $this->m_renderer->assign(array('errorcode' => 6000, 'errormessage' => $e->getMessage())); 
       $this->m_renderer->render(); 
      } 
     } 
    } 

(ノート、私はカスタムDBConnector変数の型を処理するクラスを持っている)そして、これは私のログイン機能

public function loginUser(){ 
     if (isset($_POST['name']) && isset($_POST['password'])){ 
      try 
      { 
       $name = $_POST["name"]; 
       $password = $_POST['password']; 

       $db = CDatabase::getInstance(); 
       $db->prepare("SELECT * FROM user where LOWER(name) = LOWER(?)"); 
       $db->bindParams(array($name)); 
       $db->execute(); 

       $result = $db->fetch(); 
       if ($result->num_rows > 0){ 
        $row = $result->fetch_assoc(); 
        $salt = $row["user_id"];  //use user_id as salt 
        $saltedHash = $row["password"]; 

        var_dump($password); 
        var_dump(hash('sha256', $password, $salt)); 
        var_dump($saltedHash); 
        if (hash('sha256', $password, $salt) == $saltedHash) { 
         echo "correct"; 
        } else { 
         echo 'Error: password incorrect'; 

        } 
       }else{ 
        echo "Error: username does not exist"; 
       } 
      } 
      catch(Exception $e) 
      { 
       $this->m_renderer->loadTemplate('error.html'); 
       $this->m_renderer->assign(array('errorcode' => 6000, 'errormessage' => $e->getMessage())); 
       $this->m_renderer->render(); 
      } 
     } 
    } 

であり、これは私のコンソールから出力され

string(32) "��Ё�L}e�/���Z���O+�,�]l�� //insertUser hash('sha256', $password, $salt); 
" 
true 
string(4) "test" 
string(32) "��Ё�L}e�/���Z���O+�,�]l�� //loginUser hash('sha256', $password, $salt) 
" 
string(31) "????L}e?/???Z???O+?,?]l?? //this value is in my database 
" 
Error: password incorrect 

ローカルマシンで最新バージョンのXAMPPを使用しています

ありがとうございました

答えて

1

hash()は、バイナリデータを返します。このバイナリデータは、データベースにバイナリデータとして処理/保存されていないため、ハッシュが破損しています。

大きな問題は、最初にhash()を使用していることです。 でも、という大きな問題は、あなたが間違って使用していることです。その署名を参照してください:

string hash (string $algo , string $data [, bool $raw_output = false ]) 

それは塩を受け入れていません。あなたが$saltと設定したものは、実際には$raw_outputです。そのため、バイナリデータを取得しています。

単一の非シャットダウンSHA-256ラウンドも、パスワードの保管には安全ではありません。あなたのハッシュパスワードは、おそらくすでにどこかに存在するレインボーテーブル攻撃のためのプライムです。

hashでの使用を中止する場合は、代わりにpassword_hashpassword_verifyを使用してください。それらを正確に使用する方法の例を参照してください。

関連する問題