Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

junaooaks

segurança password

Recommended Posts

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

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

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

sim estou inserindo o password criptografado pelo password_hash

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

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

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

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); 

Beraldo

foi 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
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

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
rockrgo

agora ta o bicho o Damon consegue o que esta acontecendo

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.