Como criptografar de senhas em PHP

Quando estamos desenvolvendo sistemas web que envolvem autenticação de usuários, uma das maiores responsabilidades de um desenvolvedor é garantir que as senhas sejam armazenadas de forma segura. Jamais devemos armazenar senhas em texto puro no banco de dados, pois isso cria uma grave vulnerabilidade. Em vez disso, utilizamos criptografia para proteger essas informações. Hoje, vamos aprender como criptografar senhas em PHP de maneira eficiente e segura!

Por que criptografar senhas?

Armazenar senhas de forma não criptografada é um dos maiores erros que podem ser cometidos em termos de segurança. Caso o banco de dados seja invadido, todas as senhas dos usuários estarão expostas.

A criptografia de senhas garante que, mesmo que um atacante obtenha acesso ao banco de dados, ele não consiga ver ou usar as senhas dos usuários diretamente.

A criptografia de senhas transforma a senha original em um valor codificado (hash), irreversível, garantindo que a senha não possa ser recuperada diretamente, apenas verificada.

Funções seguras para criptografia de senhas no PHP

PHP oferece uma função embutida chamada password_hash(), que facilita a criação de senhas criptografadas de forma segura. Essa função utiliza algoritmos modernos como Bcrypt e Argon2, recomendados para garantir uma boa proteção contra ataques.

Como Usar o password_hash()

Aqui está um exemplo de como criptografar uma senha usando o password_hash():

<?php
// Senha que o usuário forneceu
$senha = "minhasenha123";

// Criar o hash da senha
$hash = password_hash($senha, PASSWORD_DEFAULT);

// Exibir o hash gerado
echo "Hash da senha: " . $hash;
?>
  • password_hash(): Recebe a senha original e aplica uma criptografia usando o algoritmo padrão (geralmente Bcrypt). O segundo parâmetro PASSWORD_DEFAULT garante que o PHP usará o algoritmo mais recomendado;

  • O valor resultante é o hash da senha, que pode ser armazenado no banco de dados. Esse hash não pode ser revertido para a senha original.

Como verificar a senha criptografada

Quando o usuário tenta fazer login, você deve verificar se a senha que ele inseriu corresponde à senha criptografada armazenada no banco de dados. Para isso, usamos a função password_verify().

Veja como fazer isso:

<?php
// Senha que o usuário forneceu no login
$senhaDigitada = "minhasenha123";

// Hash da senha armazenada no banco de dados (exemplo)
$hashArmazenado = '$2y$10$eK5s9Hs0./IXbZTzF4c.uOhyq2YPKnTzQsPsp.1svYZf5vi.bF1WO';

// Verificar se a senha digitada corresponde ao hash armazenado
if (password_verify($senhaDigitada, $hashArmazenado)) {
    echo "Senha correta. Login bem-sucedido!";
} else {
    echo "Senha incorreta!";
}
?>

password_verify(): Recebe a senha fornecida pelo usuário e o hash armazenado no banco de dados. Ele compara os dois e retorna true se a senha estiver correta, ou false se estiver incorreta.

Por que não usar algoritmos simples como md5() ou sha1()?

Antigamente, muitos desenvolvedores usavam funções como md5() ou sha1() para criptografar senhas. No entanto, esses algoritmos são considerados inseguros atualmente, pois eles são rápidos demais e vulneráveis a ataques de força bruta ou de rainbow tables (tabelas pré-calculadas de hashes para senhas comuns).

Por isso, é altamente recomendável usar funções mais seguras, como password_hash(), que foram projetadas para serem lentas, dificultando ataques.

Gerenciando o custo de criptografia

A função password_hash() usa um parâmetro de custo, que define o tempo necessário para gerar o hash. O valor padrão é suficiente para a maioria dos casos, mas você pode ajustá-lo conforme a necessidade do seu sistema:

<?php
// Ajustando o custo de criptografia (o padrão é 10)
$options = [
    'cost' => 12, // O valor de custo aumenta o tempo de processamento
];

// Gerar o hash da senha com um custo maior
$hash = password_hash("minhasenha123", PASSWORD_DEFAULT, $options);

echo $hash;
?>

O custo define o número de iterações de processamento. Um valor maior torna o algoritmo mais lento e, portanto, mais seguro contra ataques, mas também aumenta o tempo de login para o usuário.

Atualizando o hash da senha

Caso o algoritmo ou o custo de hashing seja atualizado, você pode verificar se o hash precisa ser regenerado usando a função password_needs_rehash(). Isso é útil quando, por exemplo, um algoritmo mais seguro se torna o padrão ou se você quiser aumentar o custo:

<?php
$hashArmazenado = '$2y$10$eK5s9Hs0./IXbZTzF4c.uOhyq2YPKnTzQsPsp.1svYZf5vi.bF1WO';

// Verificar se o hash da senha precisa ser atualizado
if (password_needs_rehash($hashArmazenado, PASSWORD_DEFAULT, ['cost' => 12])) {
    // Gerar um novo hash se necessário
    $novoHash = password_hash("minhasenha123", PASSWORD_DEFAULT, ['cost' => 12]);
    // Atualizar o hash no banco de dados
    echo "Hash atualizado!";
}
?>

Salvar o hash no banco de dados

O hash gerado pela função password_hash() pode ser salvo diretamente no banco de dados, pois ele já contém todas as informações necessárias, como o algoritmo utilizado e o custo de processamento. Aqui está um exemplo básico de como salvar um hash de senha em um banco de dados MySQL usando PDO:

<?php
try {
    // Conectar ao banco
    $pdo = new PDO("mysql:host=localhost;dbname=meubanco", "usuario", "senha");

    // Senha do usuário
    $senha = "minhasenha123";

    // Gerar o hash da senha
    $hash = password_hash($senha, PASSWORD_DEFAULT);

    // Inserir o hash no banco de dados
    $sql = "INSERT INTO usuarios (nome, senha) VALUES (:nome, :senha)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        ':nome' => "João Silva",
        ':senha' => $hash,
    ]);

    echo "Usuário cadastrado com sucesso!";
} catch (PDOException $e) {
    echo "Erro ao inserir usuário: " . $e->getMessage();
}
?>

Criptografar senhas é essencial para proteger os dados de seus usuários.

Com o password_hash() e password_verify() em PHP, você pode garantir que as senhas sejam armazenadas de forma segura e protegidas contra ataques comuns. Nunca armazene senhas em texto puro e evite usar funções obsoletas como md5() e sha1().

QUER APRENDER PHP ORIENTADO A OBJETOS OU APERFEIÇOAR O QUE JÁ SABE?

Então conheça o curso online que já ajudou milhares de pessoas a aprender a programar e desenvolver seus próprios projetos do ZERO e usando orientação a objetos de uma forma fácil de entender.

CLIQUE NA IMAGEM ABAIXO E SAIBA MAIS:

CLIQUE AQUI E SAIBA MAIS

Dúvidas ou sugestões sobre como criptografar de senhas em PHP? Deixem nos comentários! Para mais dicas, acesse o nosso canal no YouTube:
https://youtube.com/criandobits

Tags:

Sobre o Autor

Benedito Silva Júnior
Benedito Silva Júnior

Bacharel em Sistemas de Informação pelo Instituto Paulista de Pesquisa e Ensino IPEP. Apaixonado por tecnologias e games do tempo da vovó!

0 Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *