Ir para conteúdo

Arquivado

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

Rodrigo5468

password_hash

Recommended Posts

Olá,

Estou com muita dificuldade em inserir e atualizar a senha usando o método password_hash. Alguém poderia me explicar como eu posso fazer isso? Tenho um crud, ele funciona perfeitamente, mas quero implementar o password_hash na senha. Como fazer isso?

<?php
	require_once 'Crud.php';
	
	class Usuarios extends Crud {
		protected $table = 'usuarios';
		
		private $nome;
		private $email;
		private $senha;
		
		public function setNome($nome) {
			$this->nome = $nome;
		}
		
		public function getNome() {
			return $this->nome;
		}
		
		public function setEmail($email) {
			$this->email = $email;
		}
		
		public function setSenha($senha) {
			$this->senha = $senha;
		}
		
		public function insert() {
			$sql  = "INSERT INTO $this->table (nome, email, senha) VALUES (:nome, :email, :senha)";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':nome', $this->nome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			return $stmt->execute(); 
		}

		public function update($id) {
			$sql  = "UPDATE $this->table SET nome = :nome, email = :email, senha = :senha WHERE id = :id";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':nome', $this->nome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			$stmt->bindParam(':id', $id);
			return $stmt->execute();
		}
	}

#Edit:

Pensei em adicionar isso, mas não resultou, o que estou fazendo de errado?

public function hash($senha) {
	$options = [
		'cost'	=> 11,
		'salt'	=> mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
	];
	
	return password_hash($senha, PASSWORD_BCRYPT, $options);
}
	
public function verificarPassword($senha, $hash) {
	if(password_verify($senha, $hash)) {
		return true;    
	}
	
	return false;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

possivelmente versão de php, na versão 5.5 foram criadas as funcoes:

password get info
password hash
password needs rehash
password verify
minha versão é a 4.ponto alguma coisa e não funcionaram, funcionou somente a mais antiga:
$salt = "10";
$hash = md5($password . $salt);
mas não é tão segura quanto as da nova versao
cheque pois a versao de seu php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Meu amigo o problema não é a versão, pois a versão do meu PHP é 5.5.12. O problema é que eu não sei como inserir o password_hash no código, não sei onde colocar para a senha ficar criptografada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você tem que usar password_hash antes de salvar a senha no banco (ao criar um usuário) e antes de verificar a senha digitada com a senha salva no banco.

Veja este meu artigo sobre Sistema de Login:

http://blog.ultimatephp.com.br/sistema-de-login-php/

Você vai seguir a mesma lógica, apenas mudando a forma como gera o hash da senha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria no método

		public function setSenha($senha) {
			$this->senha = $senha;
		}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Beraldo.

Acho que estou conseguindo, algumas mensagens de erro desapareceu mas ficou uma que é super chata.

Usuarios.php

<?php
	require_once 'Crud.php';
	
	class Usuarios extends Crud {
		protected $table = 'usuarios';
		
		private $nome;
		private $email;
		private $senha;
		
		public function setNome($nome) {
			$this->nome = $nome;
		}
		
		public function getNome() {
			return $this->nome;
		}
		
		public function setEmail($email) {
			$this->email = $email;
		}
		
		public function setSenha($senha) {
			$this->senha = $senha;
		}
		
		//
			//$senhaHash = password_hash($senha, PASSWORD_DEFAULT);
			
			public function hash($senha) {
				$options = [
					'cost'	=> 11,
					'salt'	=> mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
				];
				
				return password_hash($senha, PASSWORD_BCRYPT, $options);
			}
			
			public function verificarPassword($senha, $hash) {
				if(password_verify($senha, $hash)) {
					return true;    
				}
				
				return false;
			}
		//
		
		public function insert() {
			$sql  = "INSERT INTO $this->table (nome, email, senha) VALUES (:nome, :email, :senha)";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':nome', $this->nome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $senha);
			return $stmt->execute(); 
		}

		public function update($id) {
			$sql  = "UPDATE $this->table SET nome = :nome, email = :email, senha = :senha WHERE id = :id";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':nome', $this->nome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $senha);
			$stmt->bindParam(':id', $id);
			return $stmt->execute();
		}
	}

index.php

<?php
	$usuario = new Usuarios();
	
	if(isset($_POST['cadastrar'])):
		$nome	= $_POST['nome'];
		$email	= $_POST['email'];
		$senha	= $_POST['senha'];
		
		$usuario->setNome($nome);
		$usuario->setEmail($email);
		$usuario->setSenha($senha);
		
		#Insert
		if($usuario->insert()):
			echo "Inserido com sucesso!";
		endif;
	endif;
?>

Mensagem de Erro

szCR71u.png

O que devo fazer para consertar este erro e fazer que o script cadastra a senha criptografada?

#Edit

William você fala colocar essa parte dentro do setSenha? public function hash($senha) { ? Eu tentei mas não deu certo... segue...

		public function setSenha($senha) {
			if($senha) {
				$options = [
					'cost'	=> 11,
					'salt'	=> mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
				];
				
				return password_hash($senha, PASSWORD_BCRYPT, $options);
			}
			
			$this->senha = $senha;
		}
		
		public function insert() {
			$sql  = "INSERT INTO $this->table (nome, email, senha) VALUES (:nome, :email, :senha)";
			$stmt = DB::prepare($sql);
			$stmt->bindParam(':nome', $this->nome);
			$stmt->bindParam(':email', $this->email);
			$stmt->bindParam(':senha', $this->senha);
			return $stmt->execute(); 
		}

Obrigado desde já.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifica se todas as propriedades do objecto estão a ser guardadas com os devidos valores antes de chamar a bindParam.

À cabeça do método insert faz um echo de $this->nome, $this->email e $this-senha.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado a todos, mas eu conseguir... utilizei o método que o nosso amigo William disse.

		public function setSenha($senha) {
			$options = [
				'cost'	=> 11,
				'salt'	=> mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
			];
			
			$this->senha = password_hash($senha, PASSWORD_BCRYPT, $options);
			
			if(password_verify($senha, $this->senha)) {
				return true;
			}
			
			return false;
		}

Se tiver alguma coisa errado me avise, pois eu testei aqui e funcionou tudo certinho.

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.