Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
pessoal usava hash512 para fazer a criptografia, agora estou tentando usar password_hash
me parece que toda vez que é gera uma senha ele muda os caracteres..
como faço para persistência no banco de dados tipo
crio a senha
$$senha = password_hash($senha, PASSWORD_DEFAULT);
depois vou no banco de dados fazer aquele select
SELECT * FROM usuarios WHERE usuario = '$login' AND senha= '$senha'
a senha não bate com a que foi gerada e gravado no banco de dados....
como posso prosseguir com esta consulta? para validar o usuario e senha.
Como esta sendo feito o seu insert ? Qual banco que vc esta usando ?
O erro está aqui:
$$senha = password_hash($senha, PASSWORD_DEFAULT);
Note o "$$" em vez de "$". Isso gera uma variável cujo nome é o conteúdo de $senha, que é vazio.
Use só um cifrão, ficando:
$senha = password_hash($senha, PASSWORD_DEFAULT);
conheço o password_verify mas preciso verificar no banco de dados
o insert é comum
INSERT INTO usuario (senha, usuairo) VALUES('$usuario', '$senha');
e estou usando o mysql o campo senha esta varchar(200)
este erro foi gerado sem querer porque digitei aqui no forum errado..
pessoal este sistema é de teste para entender como funciona password_hash
junaooaks
o insert é comum
Mas vc esta passando para o password_hash para enserir no banco ?
sim estou inserindo o password criptografado pelo password_hash
Da uma olhada neste exemplo:
$usuario = $_POST['usuario'];
$senhaHash = password_hash( $_POST['senha'], PASSWORD_DEFAULT );
$idUsuario = 0;
$query = 'SELECT id FROM usuarios WHERE nome = ? AND senha = ?';
$stmt = $mysqli->prepare( $query );
$stmt->bind_param("ss", $usuario, $senhaHash );
$stmt->execute();
$stmt->bind_result( $idUsuario );
$stmt->fetch();
if ( $idUsuario ) {
echo 'Logado';
} else {
echo 'Usuario e/ou senha invalidos';
}olha nao sei se e um problema
toda vez que mando exibi a senha digitada ela muda os caracters da mesma palavra
exemplo:
palavra teste.
$2y$10$A14Eyj2oAWOPVfXyd7l1H.oDvNunei9f/f9eDZFnUHVnDPkvT7hAC
$2y$10$6adA7OFkNS4gtgnlTBADGu1de2awDgv2l0S/NnajJCuf.0gT2M0Nu
mandei exibi o password digitei a palavra duas vez ele deu os caracters diferente
Vou passar o exemplo inteiro para vc da uma olhada.
<?php
$page = 'Login';
session_start();
include 'header.php';
if(isset($_SESSION['username'])){
header('location: control-painel.php');
}
else{
$user_error = '';
$pass_error = '';
$login_error = '';
if(isset($_POST['login'])){
$username = $mysqli -> $_POST['username'];
$password = $mysqli -> $_POST['password'];
$cost = '11';
$salt = 'Cf1f11ePArKlBJomM0F6aJ';
$password_hash = crypt($password, '$2a$' . $cost . '$' . $salt . '$');
$id = 0;
if(empty($username)){
$user_error = 'Please insert a username';
} $pass_error = 'Please insert a password';
} $stmt = $mysqli -> prepare('SELECT id FROM user WHERE username = ? AND password = ?');
$stmt -> bind_param("ss", $username, $password_hash);
$stmt -> execute();
$stmt -> bind_result($id);
$stmt -> fetch();
if($id){
$login_error = 'Wrong username and password combination';
}
}
}
if(empty($user_error)&& empty($pass_error)&& empty($login_error)&& isset($_POST['login'])){
$stmt = $mysqli -> prepare('SELECT id FROM user WHERE username = ? AND password = ?');
$stmt -> bind_param("ss", $username, $password_hash);
$stmt -> execute();
$stmt -> bind_result($id);
$stmt -> fetch();
if($id){
session_start();
$_SESSION['username'] = $username;
header('location: control-painel.php');
}
}
else{
?>
<div class="message">
<br><br>
<?php echo $user_error; ?><br><br>
<?php echo $pass_error; ?><br><br>
<?php echo $login_error; ?><br><br>
<br><br>
</div>
<div id="form" class="bradius">
<div class="content">
<form method="post">
<label>Username: </label>
<input type="text" name="username" class="text bradius">
<label>Password: </label>
<input type="password" name="password" class="text bradius">
<input type="submit" class="submitbutton bradius" name="login" value="Login">
</form>
</div>Eu não conhecia a password_hash, mas, pelo que li, essa função gera um novo salt a cada chamada. Por isso estão gerando hashes diferentes.
Você não pode buscar no banco pelo hash. Busque só pelo login, pegue o hash do banco e compare usando hash_verify.
Veja este exemplo:
mano obrigado pela atenção mas estamos falando coisas diferentes
fi que no seu codigo você esta fazendo a comparação a sql do banco
SELECT id FROM user WHERE username = ? AND password = ?');
passando o $password_hash ja criptografado
a sua consulta vai retornar login valido se o password_hash for === do banco de dados
no meu caso esta possibilidade não confere, porque a palavra TESTE que esta gravada no banco de dados com password_hash nao confere com a palavra TESTE que estou fazendo no select
não são idênticos.
sera por causa do PASSWORD_DEFAULT
password_hash($senha, PASSWORD_DEFAULT);
Beraldofoi o primeiro que me ocorreu, mas gostaria de saber como os profissionais estão usando, aquele negocio conselhos nunca é o MASCARA.
mascara entendeu d+
Bem vamos lá !!
pessoal este sistema é de teste para entender como funciona password_hash
Estou te passando exemplos para vc ver como funciona o password_hash e adequar a sua maneira.
no meu caso esta possibilidade não confere, porque a palavra TESTE que esta gravada no banco de dados com password_hash nao confere com a palavra TESTE que estou fazendo no select
não são idênticos.
sera por causa do PASSWORD_DEFAULT
password_hash($senha, PASSWORD_DEFAULT);
a forma correta de se gravar no banco seria esta aqui.
$mysqli = new mysqli( 'enderecodoservidor', 'usuario', 'senha', 'basededados' );
$usuario = $_POST['usuario'];
$senhaHash = password_hash( $_POST['senha'], PASSWORD_DEFAULT );
$query = 'INSERT INTO usuarios ( nome, senha ) VALUES ( ?, ? )';
$stmt = $mysqli->prepare( $query );
$stmt->bind_param("ss", $usuario, $senhaHash );
$stmt->execute();
para buscar basta !
$mysqli = new mysqli( 'enderecodoservidor', 'usuario', 'senha', 'basededados' );
$usuario = $_POST['usuario'];
$senhaHash = password_hash( $_POST['senha'], PASSWORD_DEFAULT );
$idUsuario = 0;
$query = 'SELECT id FROM usuarios WHERE nome = ? AND senha = ?';
$stmt = $mysqli->prepare( $query );
$stmt->bind_param("ss", $usuario, $senhaHash );
$stmt->execute();
$stmt->bind_result( $idUsuario );
$stmt->fetch();
if ( $idUsuario ) {
echo 'Logado';
} else {
echo 'Usuario e/ou senha invalidos';
}
aconselho a deixa um campo varchar(255) para senha.Cara com o password_hash você não consegue comparar diretamente no banco
segue exemplo de como fazer um login utilizando esta função
$stmt = $conexao->prepare("SELECT * FROM usuarios WHERE username = :user");
$stmt->bindValue('user', $_POST['user']);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_OBJ);
if($result){
if(password_verify($_POST['password'], $result->password)){
$_SESSION['user'] = array(
'logado' => true,
'username'=> $result->username,
'id'=> $result->id
);
header('location: /admin/home');
}else{
$erro = true;
}
}else{
$erro = true;
}rockrgoagora ta o bicho o Damon consegue o que esta acontecendo
Você já tentou da forma que te passei? Qual resultado ?
adaptei sem o uso de pdo
ficando assim
$senha = password_hash('$_POST[senha]', PASSWORD_DEFAULT);
$sql = mysql_query(INSERT INTO usuario(usuario, senha)value('teste','$senha'))or die (mysql_error());
para o select
$senha = password_hash($senha, PASSWORD_DEFAULT);
$resultado = mysql_query("SELECT * FROM usuario WHERE usuario = '$login' AND senha= '$senha'");
while ($linha = mysql_fetch_array($resultado)) {
echo $linha[senha];
}
fiz fazendo o select depois fazer a verificação nem assim resolve
$login = filter_var($_POST['login'], FILTER_SANITIZE_STRING);
$senha = password_hash($_POST['senha'], PASSWORD_DEFAULT);
$conexao = mysql_connect("localhost", "root", "") or die("Configuração de Banco de Dados Errada!");
mysql_select_db("teste", $conexao) or die(" Banco de Dados Inexistente!");
$resultado = mysql_query("SELECT * FROM usuarios WHERE usuario = '$login'");
while ($linha = mysql_fetch_array($resultado)) {
$password = $linha[senha];
}
echo $password.' </br>'.$senha.'</br>';
//retornar 1 senha valida
echo 'teste '.password_verify($senha, $password);
no password_verify era para retornar 1 como senha valida mas não retorna nada
estou usando o php 5.5.9
mesmo usando password_verify($senha, $password) não consigo validar essa senha
as senhas não confere nunca..... :skull: isso já e terrorismo .... :yes:
eu estava criptografando a senha novamente por isso estava dando errado
http://php.net/manual/en/function.password-verify.php