Como armazenar senhas de forma segura no banco de dados MySQL com PHP?
O armazenamento seguro de senhas no banco de dados é essencial para proteger usuários contra vazamentos de dados e ataques. Em PHP, a melhor forma de armazenar senhas é utilizando a função password_hash(), que aplica um algoritmo de hashing forte e seguro.
Criando a Tabela no MySQL
O primeiro passo é criar a estrutura adequada no banco de dados:
CREATE TABLE usuarios (
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
senha VARCHAR(255) NOT NULL,
criado_em TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Aqui, a coluna senha
deve ter espaço suficiente (VARCHAR(255)
) para armazenar o hash da senha.
Armazenando a Senha com password_hash()
No momento do cadastro do usuário, utilizamos password_hash()
para criptografar a senha:
<?php
$conexao = new PDO("mysql:host=localhost;dbname=meu_banco", "usuario", "senha");
$conexao->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Capturar os dados do formulário
$nome = $_POST['nome'];
$email = $_POST['email'];
$senha = password_hash($_POST['senha'], PASSWORD_DEFAULT);
// Inserir no banco
$sql = "INSERT INTO usuarios (nome, email, senha) VALUES (:nome, :email, :senha)";
$stmt = $conexao->prepare($sql);
$stmt->bindParam(':nome', $nome);
$stmt->bindParam(':email', $email);
$stmt->bindParam(':senha', $senha);
$stmt->execute();
echo "Usuário cadastrado com sucesso!";
?>
Aqui, password_hash()
aplica um algoritmo forte de hashing, dificultando ataques de força bruta.
Validando a Senha com password_verify()
No momento do login, usamos password_verify()
para comparar a senha digitada com a armazenada:
<?php
session_start();
$conexao = new PDO("mysql:host=localhost;dbname=meu_banco", "usuario", "senha");
$email = $_POST['email'];
$senha = $_POST['senha'];
// Buscar usuário no banco
$sql = "SELECT * FROM usuarios WHERE email = :email";
$stmt = $conexao->prepare($sql);
$stmt->bindParam(':email', $email);
$stmt->execute();
$usuario = $stmt->fetch(PDO::FETCH_ASSOC);
if ($usuario && password_verify($senha, $usuario['senha'])) {
$_SESSION['usuario_id'] = $usuario['id'];
$_SESSION['usuario_nome'] = $usuario['nome'];
echo "Login bem-sucedido!";
} else {
echo "E-mail ou senha incorretos.";
}
?>
password_verify()
verifica se a senha digitada corresponde ao hash armazenado, garantindo segurança.
Por que utilizar password_hash() e password_verify() no PHP?
Armazenar senhas de forma segura é fundamental para proteger sistemas contra ataques. O uso de password_hash()
impede que senhas sejam armazenadas em texto puro, e password_verify()
garante que apenas usuários legítimos acessem suas contas. Além disso, boas práticas como uso de SSL e limitação de tentativas de login aumentam a segurança do sistema.
Algumas aplicações:
- Criação de sistemas de autenticação segura
- Proteção contra vazamentos de senhas em bancos de dados
- Implementação de login seguro em sites e aplicativos
- Prevenção contra ataques de força bruta e SQL Injection
Dicas para quem está começando
- Nunca armazene senhas em texto puro no banco de dados.
- Use sempre
password_hash()
para criar hashes seguros. - Ao autenticar usuários, utilize
password_verify()
para comparar senhas. - Evite reinventar métodos de criptografia, utilize funções nativas do PHP.
- Implemente um sistema de limitação de tentativas de login para evitar ataques de força bruta.
Contribuições de Rafael Nogueira