Password verification with bcrypt in session and mysql

1

I have a user and password that are being saved in a session, only the password is being encrypted by the bcrypt function. How do I check if the password that is saved in the session is equal to the password that is in the mysql database that is also encrypted?

    
asked by anonymous 14.04.2015 / 13:44

1 answer

1

Never, never, but never save passwords in sessions, however secure your sessions seem.

To check a hash, with bcrypt, you should simply provide the first hash (hash in the database) and encrypt the form's password (in this case, the hash stored in the session).

<?php
// See the password_hash() example to see where this came from.
// a variavel hash possui o valor da hash no banco de dados
// Imagine que este é o valor
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

// So para relembrar, que guardar senhas na sessão nao é uma boa pratica.
if (password_verify($_SESSION['senha_na_sessao'], $hash)) {
echo 'Password is valid!';
// Usuario autenticado
// Inicializar as sessoes para esse usuario
} else {
echo 'Invalid password.';
// Usuario invalido
// Retorna a pagina de login
}
?>

The password_verify function is unique to PHP > = 5.5.0

For versions of PHP below PHP < 5.5.0 there is this API that simulates these new functions.

An example:

<?php

//Reset dos valores
$usr = $pwd = "";

// Cadastro
if(isset($_POST["cadastrar"])){
// Neste exemplo, não irei verificar se o usuario digitou algo ou nao
if(isset($_POST["usuario"]) && isset($_POST["senha"])){
    $usr = $_POST["usuario"];
    $pwd = $_POST["senha"];
    // A partir daqui tratamos da senha
    // Encripta-se a senha;
    // esta funcao utiliza o blowfish por predefinicao
    $hash = password_hash($pwd, PASSWORD_DEFAULT);
    if($hash){
        // Insere no banco de dados
        // Um exemplo:
        $query = "INSERT INTO usuarios ('nome','senha') VALUES  ('{$usr}','{$hash}') LIMIT 1";
        if(mysqli_query($conexao_sqli, $query)){
            echo "Cadastrado";
            // redirecciona
        } else {
            echo "Não cadastrado";
            // redirecciona
            exit;
        }
        // Encerra a conexao algures

        }
 }
}

// Login
if(isset($_POST["entrar"])){
// Neste exemplo, não irei verificar se o usuario digitou algo ou nao
if(isset($_POST["usuario"]) && isset($_POST["senha"])){
    $usr = $_POST["usuario"];
    $pwd = $_POST["senha"];
    // A partir daqui tratamos da senha
    // Aqui faz-se a mesma, coisa, mas desta vez utiliza-se
    // a hash do banco de dados
    // O blowfish utiliza apenas os 22 primeiros carateres
    // para criar a hash
    // Uma consulta SQL/funcao que retorna a hash no banco
    // de dados passa este usuario
    // exemplo:
    $query = "SELECT nome, senha FROM usuarios WHERE usuario = '{$usr}'";
    $if(mysqli_query($conexao_sqli, $query)){
        $hash_do_banco_de_dados = mysqli_fetch_assoc($query);
        $hash = password_hash($pwd, $hash_do_banco_de_dados["senha"]);
        if($hash){
            if(password_verify($pwd, $hash)){
                echo "Logado";
                // Sessoes
                // Redirecciona
                exit;
            } else {
                echo "Nao logado";
                // redirecciona
                exit;
            }
        }
    }

 }
}



?>
<?php
if(!isset($_GET['pagina']) && $_GET['pagina'] == 'cadastrar'){
?>
<form method="POST" action="">
    Usuario:<br/>
<input type="text" name="usuario" size="30"/><br/>
Senha:<br/>
<input type="password" name="senha" size="30"/><br/>
<input type="submit" name="cadastrar" value="Cadastrar"/>
</form>
<br/>
<br/>
Clique aqui para <a href="index.php?pagina=entrar">Entrar</a>
<?php   
} elseif(isset($_GET['pagina']) && $_GET['pagina'] == 'entrar'){
?>
<form method="POST" action="">
    Usuario:<br/>
<input type="text" name="usuario" size="30"/><br/>
Senha:<br/>
<input type="password" name="senha" size="30"/><br/>
<input type="submit" name="entrar" value="Entrar"/>
</form>
<br/>
<br/>
Clique aqui para <a href="index.php?pagina=cadastrar">cadastrar</a>
<?php   
} else {
?>
<form method="POST" action="">
    Usuario:<br/>
<input type="text" name="usuario" size="30"/><br/>
Senha:<br/>
<input type="password" name="senha" size="30"/><br/>
<input type="submit" name="entrar" value="Entrar"/>
</form>
<br/>
<br/>
Clique aqui para <a href="index.php?pagina=cadastrar">Cadastrar</a>
<?php>  
}
?>

It's basically this, I took some time to create this, because I created it from gedit and also because I'm linux in a notebook: /, but I could not execute the example, but I guarantee it works, which replace the phantom connection variables I used in the example.

    
07.05.2015 / 17:08