Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 62 – API JavaScript, Node.js e Express – Password Hashing – bcrypt, scrypt, argon2

Imagem destacada da aula de API

Introdução (3 min)

Imagine um cofre. Você guarda seus bens mais preciosos lá dentro. A senha deste cofre é vital para proteger esses bens. Da mesma forma, as senhas dos seus usuários são a chave para as informações deles na sua aplicação. Hashing de senhas é como transformar essa senha simples em um código secreto indecifrável, protegendo-a mesmo que o banco de dados seja comprometido. Nesta aula, você dominará a arte do hashing com bcrypt, scrypt e argon2 no contexto de APIs Node.js/Express, construindo a base para uma segurança robusta em suas aplicações.

Conceito Fundamental (7 min)

Hashing de senha é um processo unidirecional que transforma uma senha legível em uma sequência de caracteres única e fixa, chamada hash. Diferente da criptografia, que pode ser revertida, o hashing é irreversível. Isso significa que, mesmo que um invasor obtenha acesso ao hash, não poderá reconstruir a senha original. Em produção, isso é usado em praticamente todos os sistemas de autenticação. Integra-se com bancos de dados, frameworks web como Express, e bibliotecas de autenticação. A principal vantagem é a segurança dos dados do usuário. A desvantagem é que, se o algoritmo de hashing for fraco, ele pode ser vulnerável a ataques de força bruta ou rainbow tables.

bcrypt, scrypt e argon2 são algoritmos de hashing projetados para serem lentos e computacionalmente intensivos, dificultando esses ataques. Argon2 é geralmente considerado o mais robusto dos três.

Implementação Prática (10 min)

Vamos implementar o bcrypt em um endpoint Express.js. A compatibilidade com HostGator Plano M é garantida, pois o código usa apenas módulos padrão e bibliotecas amplamente suportadas.

const express = require('express');
const bcrypt = require('bcrypt'); // Importe o bcrypt

const app = express(); app.use(express.json()); // Middleware para processar JSON

// Rota de registro de usuário app.post('/register', async (req, res) => { try { const { username, password } = req.body;

// Validação básica de entrada if (!username || !password) { return res.status(400).json({ error: 'Username e password são obrigatórios' }); }

// Gera um salt. 10 é um bom valor inicial. Ajuste conforme necessário. const saltRounds = 10; const salt = await bcrypt.genSalt(saltRounds);

// Gera o hash da senha usando o salt const hashedPassword = await bcrypt.hash(password, salt);

// Aqui você normalmente salvaria o username e o hashedPassword no banco de dados console.log('Usuário registrado:', username); console.log('Senha hasheada:', hashedPassword); // Log profissional

res.status(201).json({ message: 'Usuário registrado com sucesso' }); } catch (error) { console.error('Erro ao registrar usuário:', error); // Error handling res.status(500).json({ error: 'Erro interno do servidor' }); } });

app.listen(3000, () => console.log('Servidor rodando na porta 3000'));

npm install bcrypt

Este código implementa um endpoint /register que recebe username e password, gera um salt usando bcrypt.genSalt() e então hasheia a senha com bcrypt.hash(). O salt adiciona aleatoriedade ao hash, tornando-o mais seguro. O código inclui validação de entrada, logging e error handling, seguindo as melhores práticas.

Exercício Hands-On (5 min)

Modifique o código acima para implementar o login do usuário. Você receberá o username e password na requisição. Recupere o hash correspondente ao username do seu banco de dados (simule com um objeto em memória para este exercício). Use bcrypt.compare() para comparar a senha fornecida com o hash armazenado. Retorne uma mensagem de sucesso ou falha dependendo do resultado da comparação.

Solução:

// ... (código anterior)

app.post('/login', async (req, res) => { try { // ... (código para recuperar o hash do banco de dados)

const match = await bcrypt.compare(password, hashedPassword);

if (match) { res.json({ message: 'Login bem-sucedido!' }); } else { res.status(401).json({ error: 'Credenciais inválidas' }); } } catch (error) { // ... (error handling) } });

// ... (resto do código)

Teste seu endpoint /login com Postman ou curl. Certifique-se de testar com credenciais válidas e inválidas. Explore a documentação do bcrypt, scrypt e argon2 para entender as nuances de cada algoritmo e escolher o mais adequado para sua aplicação. Lembre-se de que segurança é um processo contínuo. Mantenha-se atualizado sobre as melhores práticas e novas vulnerabilidades.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas