2015-01-08 1 views
2

현재 Android 응용 프로그램을 개발 중이며 사용자 등록 및 로그인 절차에 PHP/MySQL/JSON을 사용하고 있습니다. 이제는 bcyrpt를 사용하여 사용자 데이터를 해시하고 싶습니다. 나는 완전히 PHP에 익숙하고 해싱을위한 튜토리얼을 많이 읽었지만 사용할 수있는 PHP 스크립트에 대한 적절한 튜토리얼을 찾지 못했습니다. password_hash() 함수를 시도했지만 작동하지 않습니다.PHP/MySQL/JSON을 사용하여 사용자 데이터에 bcrypt를 사용하는 방법

내 파일에 bcrypt를 어떻게 사용할 수 있는지 조언 해 주시겠습니까?

이 그 내 PHP 파일입니다

로그인

<?php 

require("config.inc.php"); 

if (!empty($_POST)) { 

    $query = " 
      SELECT 
       id, 
       username, 
       password 
      FROM users 
      WHERE 
       username = :username 
     "; 

    $query_params = array(
     ':username' => $_POST['username'] 
    ); 

    try { 
     $stmt = $db->prepare($query); 
     $result = $stmt->execute($query_params); 
    } 
    catch (PDOException $ex) { 

     $response["success"] = 0; 
     $response["message"] = "Database Error1. Please Try Again!"; 
     die(json_encode($response)); 

    } 

    $validated_info = false; 

    $row = $stmt->fetch(); 
    if ($row) { 

     if ($_POST['password'] === $row['password']) { 
      $login_ok = true; 
     } 
    } 

    if ($login_ok) { 
     $response["success"] = 1; 
     $response["message"] = "Login successful!"; 
     die(json_encode($response)); 
    } else { 
     $response["success"] = 0; 
     $response["message"] = "Invalid Credentials!"; 
     die(json_encode($response)); 
    } 
} else { 
?> 
     <h1>Login</h1> 
     <form action="login.php" method="post"> 
      Username:<br /> 
      <input type="text" name="username" placeholder="username" /> 
      <br /><br /> 
      Password:<br /> 
      <input type="password" name="password" placeholder="password" value="" /> 
      <br /><br /> 
      <input type="submit" value="Login" /> 
     </form> 
     <a href="register.php">Register</a> 
    <?php 
} 

?> 

당신이 password_hash() 함수를 호출하는 대신, 직접 암호를 저장하지 않아야하여 등록 스크립트에서

<?php 

    require("config.inc.php"); 

    if (!empty($_POST)) { 

     if (empty($_POST['username']) || empty($_POST['password'])) { 

      $response["success"] = 0; 
      $response["message"] = "Please Enter Both a Username and Password."; 

      die(json_encode($response)); 
     } 

     $query  = " SELECT 1 FROM users WHERE username = :user"; 
     $query_params = array(
      ':user' => $_POST['username'] 
     ); 

     try { 
      $stmt = $db->prepare($query); 
      $result = $stmt->execute($query_params); 
     } 
     catch (PDOException $ex) { 

      $response["success"] = 0; 
      $response["message"] = "Database Error1. Please Try Again!"; 
      die(json_encode($response)); 
     } 

     $row = $stmt->fetch(); 
     if ($row) { 

      $response["success"] = 0; 
      $response["message"] = "I'm sorry, this username is already in use"; 
      die(json_encode($response)); 
     } 

     $query = "INSERT INTO users (username, password) VALUES (:user, :pass) "; 

     $query_params = array(
      ':user' => $_POST['username'], 
      ':pass' => $_POST['password'] 
     ); 

     try { 
      $stmt = $db->prepare($query); 
      $result = $stmt->execute($query_params); 
     } 
     catch (PDOException $ex) { 

      $response["success"] = 0; 
      $response["message"] = "Database Error2. Please Try Again!"; 
      die(json_encode($response)); 
     } 

     $response["success"] = 1; 
     $response["message"] = "Username Successfully Added!"; 
     echo json_encode($response); 

    } else { 
    ?> 
     <h1>Register</h1> 
     <form action="register.php" method="post"> 
      Username:<br /> 
      <input type="text" name="username" value="" /> 
      <br /><br /> 
      Password:<br /> 
      <input type="password" name="password" value="" /> 
      <br /><br /> 
      <input type="submit" value="Register New User" /> 
     </form> 
     <?php 
    } 


    ?> 
+2

난 못해를 'password_hash' 함수를 사용했는지 확인하십시오. 그 문제에 특별히 어떤 문제가 있습니까? 등록 할 때 암호를 해시 한 다음 로그인 할 때 사용자의 입력 암호를 ​​해시하고 'password_verify'를 사용하여 두 해시를 비교하십시오. – halfer

+0

[유용 할 수도 있습니다] (http://www.the-art-of-web.com/php/blowfish-crypt/) – iamgory

+0

password_hash()를 사용하지 않았음에도 불구하고 나중에 사용하려는 경우, PHP를 사용하려면 서버에서 실행중인 PHP 5.5 이상이 필요합니다. – baao

답변

1

등록 그 결과를 저장하십시오 :

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT); 
0 당신이했던 것처럼 로그인 스크립트에서

당신은 데이터베이스에서 암호 해시를 얻을 수 있지만, 대신에 입력 한 암호와 비교, 당신은 password_verify() 함수를 호출 할 수 있습니다

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb); 
관련 문제