Aprenda a armazenar senhas de forma segura no MySQL com PHP

Veja como armazenar senhas com segurança no banco de dados MySQL utilizando PHP e a função password_hash().

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.

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.
Foto de Rafael Nogueira
Contribuições de
Rafael Nogueira

Especialista em desenvolvimento backend com PHP para aplicações escaláveis.

Mais sobre o autor
Compartilhe este tutorial: Como armazenar senhas de forma segura no banco de dados MySQL com PHP?

Compartilhe este tutorial

Continue aprendendo:

Como fazer login e autenticação de usuário usando PHP e MySQL?

Veja como implementar um sistema de login com PHP e MySQL utilizando sessões e senhas criptografadas para maior segurança.

Tutorial anterior

Como exibir dados do banco de dados em uma tabela HTML no PHP?

Veja como buscar registros do MySQL e exibi-los dinamicamente em uma tabela HTML utilizando PHP.

Próximo tutorial