2013-05-23 2 views
1

У меня было много проблем с моим кодом, так как я впервые начал изучать что-то о хэшировании и засовывании паролей. Во-первых, я узнаю, как «хэш» пароли с MD5 (да, не делайте этого больше), затем с хешем и SHA256 и, наконец, теперь с bcrypt (или, по крайней мере, я считаю, что это bcrypt). Вот мой регистрационный код на данный момент:PDO Fetching Зашифрованный пароль?

register.php

<html> 
<head> 
<title>PDO - hashing algorithm</title> 
</head> 
<body> 
    <?php 
     if(isset($_POST['submit'])) { 
      define("DB_DSN", "mysql:host=localhost;dbname=test"); 
      define ("DB_USER", "root"); 
      define ("DB_PASS", ""); 

      try { 
      $connect = new PDO (DB_DSN, DB_USER, DB_PASS); 
      $query = "CREATE TABLE IF NOT EXISTS `users` (
        `id` INT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL, 
        `username` VARCHAR(100) NOT NULL, 
        `password` VARCHAR(500) NOT NULL 
      )ENGINE=InnoDB DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_swedish_ci;"; 
      $stmt = $connect->prepare($query); 
      $stmt->execute(); 

      } catch (PDOException $e) { 
       echo $e->getMessage(); 
      } 
      // Let's hash the password 
      $salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22); 
      $hashedpassword = crypt($_POST['password']. '$2a$12$' .$salt); 
     try { 
     $query = "INSERT INTO `users` (`username`, `password`) VALUES (:username, :password)"; 
     $stmt = $connect->prepare($query); 
     $stmt->execute(array(
          ':username' => $_POST['username'], 
          ':password' => $hashedpassword 
         )); 
       if ($stmt->rowCount() == 1) { 
        echo "Well done, user has registered successfully"; 

       } else { 
        echo "An error occured.. Please try again"; 
       } 
     } catch (PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 
    ?> 
    <form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"> 
    <p>Username: <input type="text" name="username"/></p> 
    <p>Password: <input type="password" name="password" /></p> 
    <input type="submit" name="submit" /> 
    </form> 
</body> 
</html> 

Этот код работает и будет склеп пароль, так что не мой главный вопрос. Мой главный вопрос: как мне сравнить введенный пользователем пароль и пароль, хранящиеся в db, когда я хочу создать страницу входа?

вот мой login.php atm. Скажите, если вы видите что-то, что у меня нет, но я не могу заставить это работать, он не выведет имя пользователя и пароль из базы данных.

<?php 
     try { 
     define("DB_DSN", "mysql:host=localhost;dbname=test"); 
     define ("DB_USER", "root"); 
     define ("DB_PASS", ""); 

      $connect = new PDO (DB_DSN, DB_USER, DB_PASS); 

     } catch (PDOException $e) { 

      echo $e->getMessage(); 
     } 

     if(isset($_POST['submit'])) { 

     $query = "SELECT * FROM `users` WHERE (username) = :username"; 
     $stmt = $connect->prepare($query); 
     $stmt->execute(array(
         ':username' => $_POST['username'] 
         )); 
      if($stmt->rowCount() == 0) { 
       echo "User doesn't exist"; 
      } 
       $row = $stmt->fetch(); 

       if (crypt($_POST['password'], $row['password']) == $row['password']) { 
        echo $row['username']. $row['password']; 
       } else { 
        return false; 
       } 
     } 
    ?> 
+0

Извлечь хэш из bcrypt из базы данных, используя прилагаемое использование r ID/имя. Выбранное значение * должно содержать соль и количество раундов, а также результат хэша. Затем используйте это вместе с предоставленным пользователем вводом для генерации нового значения bcrypt и сравнения - аутентификация действительна тогда и только тогда, когда они являются одинаковыми. Я совершенно уверен, что это показано на примерах. Или, лучше, используйте аккуратную библиотеку/обертку. (В отличие от сломанного метода хэширования пароля без соли, он требует первой выборки соли, чтобы его можно было использовать для вычисления хэша вызова.) – user2246674

+0

Я отредактировал свой комментарий ниже с образцом кода, который, надеюсь, поможет вам. –

ответ

1

Пожалуйста, смотрите эту ссылку на учебник о том, как это сделать: Using bcrypt to store passwords

EDIT:

Я нашел некоторые из моего рабочего кода, который я буду размещать здесь, мы надеемся помочь.

Во-первых, я использую пользовательскую функцию:

function better_crypt($input, $rounds = 7){ 
    $salt = ""; 
    $salt_chars = array_merge(range('A','Z'), range('a','z'), range(0,9)); 
    for($i=0; $i < 22; $i++) { 
     $salt .= $salt_chars[array_rand($salt_chars)]; 
    } 

    return crypt($input, sprintf('$2a$%02d$', $rounds) . $salt); 
} 

Затем, когда счет сначала создается, хранить $ password_hash в базе данных:

$password_hash = better_crypt($_POST['password']); 

Затем при входе в систему, сравнить представленный пароль и хэш пароля в базе данных:

// $password = submitted login form password 
// $row['password'] = the password hash in the database 
if(crypt($password, $row['password']) == $row['password']) { 
//Success! 
+0

Я обновил свой комментарий, надеюсь, будет более ясным и иметь больше смысла. –

+0

Я редактирую свое первое сообщение, чтобы увидеть login.php –

+0

Спасибо за ваш код «snippet» .. Это помогло мне много! Еще один вопрос, хотя он сработал. Пока вы создали эту функцию better_crypt, какое значение получает входная переменная? –