2016-12-19 2 views
-6

Good Evening Guys !! .. Я в настоящее время разрабатываю систему проверки подлинности документов, и я хочу, чтобы пароли пользователей были хэшированы или зашифрованы.безопасная двухсторонняя технология хэширования

Так что мой вопрос: какой лучший и самый безопасный метод HWW Hash или Encrypting я буду использовать ..

+3

Что вы имеете в виду под «двухсторонним»? Если это хэш, это определенно односторонний по определению. Используйте ['password_hash'] (https://php.net/password-hash). – SOFe

+1

Хеширование только в одном направлении. Шифрование - это два пути. Пароли следует только хэшировать. Для php используйте http://php.net/manual/en/function.password-hash.php – Steve

+0

два пути, как правило, небезопасны, лучше использовать один способ, который является 'password_hash(); и 'password_verify();' –

ответ

2

Как уже было предложено в комментариях выше лучший и простой способ заключается в использовании password_hash(); и password_verify(); подробнее доступна на веб-сайте php.net, а также использовать подготовленные заявления либо с MySQLi или PDO в моя основная регистрация пользователя я использовал PDO.

Пожалуйста, это не просто базовый пример того, как использовать password_hash и password_verify();

мы будем использовать password_hash() при регистрации и password_verify() при входе в

db.php

<?php 


    $server="localhost"; 
    $username="root"; 
    $password=""; 

    try{ 

     $dbh = new PDO("mysql:host=$server;dbname=sytemDb",$username,$password); 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    }catch(PDOException $exc){ 

     error_log($exc); 
    } 
?> 

Данный скрипт делает подключение к нашей базе данных.

register.php

<?php 

    include 'db.php'; 
    $errors=""; 
    if (isset($_POST['register'])) { 

     //check if values are not empty 

     if(empty($_POST['email'])){ 

      die("please enter email"); 
      $errors++; 
     }else{ 

      $email = $_POST['email']; 

      //then check for valid email 
     } 
    } 
    if(empty($_POST['upass'])){ 

     die("enter password"); 
     $errors++; 
    }else{ 

     $password = $_POST['upass']; 

     $hash = password_hash($password,PASSWORD_DEFAULT);//hashing password 
    } 

    if($errors <=0){ 

     //no errors save to db 

     $stmt= $dbh->prepare("INSERT INTO users (username,password) VALUES(?,?)"); 
     $stmt->execute(array($username,$hash)); 

     echo "User registered"; 
    } 


?> 







<!DOCTYPE html> 
<html> 
<head> 
    <title>User Registration</title> 
</head> 
<body> 


    <form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 

     <input type="email" name="email" placeholder="Ente Username"> 
     <input type="password" name="upass" placeholder="Enter Password"> 
     <button type="submit" name="register">Register</button> 

    </form> 

</body> 
</html> 

login.php

<?php 
    ob_start(); 
    session_start(); 

    include 'db.php'; 

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


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

      die("enter password or username"); 
     }else{ 

      $uname = $_POST['username']; 
      $password = $_POST['pass']; 
     } 

     try { 

      $stmt = $dbh->prepare("SELECT userid,password,username from users where username = ?"); 
      $stmt->bindValue(1,$uname); 
      $stmt->execute(); 

      $results = $stmt->fetchall(PDO::FETCH_ASSOC); 

      if(count($results) > 0){ 
       //if username is correct continue check entered password against saved hash 

       foreach ($results as $row) { 

        if(password_verify($password,$row['password'])){ 
         //password and saved hash match go to dashboard 

         echo "login success"; 
         $_SESSION['user']= $row['userid']; 
         header("refresh:5;url=dashboard"); 
        }else{ 

         echo "username and password does not match"; 
        } 
       } 
      }else{ 

       echo "username and password does not match"; 
      } 

     } catch (PDOException $e) { 


      error_log($e); 

     } 
    } 






?> 




<!DOCTYPE html> 
<html> 
<head> 
    <title>Login</title> 
</head> 
<body> 

<form method="POST" action=""> 

    <input type="text" name="username" placeholder="Enter username"> 
    <input type="password" name="pass" placeholder="Enter password"> 

    <button type="submit" name="login">Login</button> 

</form> 

</body> 
</html> 

Это должно сделать его очень простой хэш пароля доступна в ручном here и here

password_verify () также доступны here

Пожалуйста, используйте php 5.6 или выше, из которых предположительно должны были быть u.

Это примерно. Надеюсь, это укажет вам на правильное направление.

NB: Всегда проверяйте входные данные от пользователя, не забудьте процедить и дезинфицировать вход затем подготовить заявление, чтобы сохранить в БД.

Заставить пользователя забыть пароль, но есть много способов сбросить пароль пользователя, одним из основных способов является наличие столбца токена autho на ur db.

следующий образ очень простой для начинающих только зарезок своей карьеры лол;)

<?php 

function ForgetPassword() 
{ 

    try { 
     //search the user on the database 
     $stmt = $dbh->prepare("SELECT email,userid,firstname,lastname from users where email = ?"); 
     $stmt->bindvalue($email); 
     $stmt->execute(); 
     $results = $stmt->fetchall(PDO::FETCH_ASSOC); 
     if (count($results) > 0) { //user found generate authentication token 
      foreach ($results as $row): 
       $userid  = base64_encode($row['userID']); 
       $randomAuth = md5(uniqid(rand())); 
       $dataUpdate = $dbh->prepare("UPDATE users set auth_token = ? where email = ?"); 
       $dataUpdate->execute(array(
        $randomAuth, 
        $row['email'] 
       )); 

       //send reset link to the user 

       $link = "<a href=\"" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] . "resetpassword?id=$userid&token=$randomAuth\">Reset your password</a>"; 

       $header = "MIME-Version: 1.0" . "\r\n"; 
       $header .= "Content-type:text/html;charset=UTF-8" . "\r\n"; 
       $header .= 'From: <>' . "\r\n"; 

       $message = "<p> Hello " . $row['firstname'] . " " . $row['lastname'] . "</p>"; 
       $message .= "<p> You have requested to reset your password your password</p>"; 
       $message .= "<p>" . $link . "</p>"; 

       if (mail(($row['email']), "Password Reset", $message, $header)) { 

        $successMessage = "Reset link sent to the provided email address"; 

       } else { 

        error_log("cound not send message"); 
       } 
      endforeach; 
     } else { 

      $successMessage = "Reset link sent to the provided email address"; 
     } 
    } 
    catch (PDOException $ex) { 

     error_log($ex); 
    } 

} 
?> 

Затем сбросьте passwordpage

<?php 

function resetPassword() 
{ 

    if (isset($_GET['code']) && isset($_GET['token'])) { 

     $code = base64_decode($_GET['code']); 
     $token = $_GET['token']; 

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

      //check empty fields 

      if (empty($_POST['newpassword'])) { 

       $errorMessage = "enter password"; 
       $errors++; 
       return $errorMessage; 
      } else { 

       $password = $_POST['newpassword']; 

       $hash = password_hash($password, PASSWORD_DEFAULT); //password encryption 
      } 
      if (!empty($_POST['newpassword']) && empty($_POST['confirmpassword'])) { 

       $errorMessage = "Please confirm your password"; 
       $errors++; 
       return $errorMessage(); 
      } 

      if (!empty($_POST['confirmpassword']) && $_POST['confirmpassword'] !== $_POST['newpassword']) { 

       return "Passwords does not match"; 
       $errors++; 
      } 

     } 

     if ($errors <= 0) { 

      try { 

       $stmt = $dbh->prepare("Update users set password = ? where userID = ? AND auth_token = ?"); 
       $stmt->execute(array(
        $hash, 
        $code, 
        $token 
       )); 

       return "Password successfully changed.. Redirecting to login page"; 

       $update = $dbh->prepare("UPDATE users set aut_token = NULL where userID = ? "); 
       $update->bindValue(1, $code); 
       $update->execute(); 

       header("refresh=3:url;login"); 

      } 
      catch (PDOException $e) { 

       error_log($e->getMessage()); 
      } 

     } 

    } else { 
     //token code error 
     return "The link have expired, please go back and request a new one"; 

    } 


} 
?> 
+0

вы можете показать мне код о том, как проверить? – toomelette

+0

@toomelette ответ обновлен. –

+0

Большое вам спасибо за помощь, сэр, я очень ценю это. – toomelette

Смежные вопросы