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.