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.

Contribuições de Rafael Nogueira

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