junaooaks 3 Denunciar post Postado Outubro 24, 2014 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. Compartilhar este post Link para o post Compartilhar em outros sites
rockrgo 138 Denunciar post Postado Outubro 24, 2014 http://php.net/manual/en/function.password-verify.php Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 24, 2014 Como esta sendo feito o seu insert ? Qual banco que vc esta usando ? Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 24, 2014 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); Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 24, 2014 rockrgo conheço o password_verify mas preciso verificar no banco de dados Damon o insert é comum INSERT INTO usuario (senha, usuairo) VALUES('$usuario', '$senha'); e estou usando o mysql o campo senha esta varchar(200) Beraldo este erro foi gerado sem querer porque digitei aqui no forum errado.. pessoal este sistema é de teste para entender como funciona password_hash Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 24, 2014 junaooaks o insert é comum Mas vc esta passando para o password_hash para enserir no banco ? Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 24, 2014 sim estou inserindo o password criptografado pelo password_hash Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 24, 2014 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'; } Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 24, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 24, 2014 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'; } if(empty($password)){ $pass_error = 'Please insert a password'; } if(!empty($username) && !empty($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> Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Outubro 24, 2014 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: http://stackoverflow.com/a/14992543 Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 24, 2014 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+ Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 24, 2014 junaooaks 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. Compartilhar este post Link para o post Compartilhar em outros sites
rockrgo 138 Denunciar post Postado Outubro 24, 2014 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; } Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 24, 2014 rockrgoagora ta o bicho o Damon consegue o que esta acontecendo Compartilhar este post Link para o post Compartilhar em outros sites
Damon 20 Denunciar post Postado Outubro 24, 2014 junaooaks Você já tentou da forma que te passei? Qual resultado ? Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 24, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 27, 2014 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 Compartilhar este post Link para o post Compartilhar em outros sites