Primeiras aulas do curso Node.js e JWT: autenticação com tokens

Node.js e JWT: autenticação com tokens

Protegendo as senhas no banco de dados - Introdução

Olá eu sou Andrew Ijano e bem-vindos a mais um curso sobre “Node.js”. Agora, com foco maior em segurança em sistemas de autenticação. O que vamos aprender nesse curso?

Neste curso, vamos agora olhar com mais calma os problemas de segurança que podem acontecer na nossa aplicação, como o que acontece quando o nosso banco de dados vaza? Como conseguimos nos proteger contra esse tipo de situação? E o cliente que está enviando uma requisição para o nosso servidor? Ele é quem ele diz que é? Como conseguimos ter certeza disso?

Para responder essas perguntas, vamos dar uma olhada sobre o que são “Funções de Hashing” e como conseguimos usá-las para proteger nossas senhas de vazamentos. E, também, vamos dar um passo além na autenticação, vendo sistema de autenticação sem sessões. Nesse caso, vamos usar Tokens .

E, também, vamos entender como esse sistema tem uma vantagem na escalabilidade da sua aplicação. E, para usar isso, vamos aprender o que é o “Json Web Token” e como que a gente consegue usá-lo na nossa aplicação e porque ele, por si só, tem a garantia de um certificado.

Para fazer tudo isso daí, vamos começar com o API de um blog, o “Blog do Código”. Esse vai ser um blog onde programadoras e programadores podem discutir e fazer post sobre os últimos acontecimentos do mundo do sistema de software. E, para termos um enfoque maior aqui no conteúdo do nosso curso, essa API já vai começar com algumas funcionalidades: vamos poder adicionar, listar e deletar usuários e adicionar e listar posts.

E, ao final do curso, você vai conseguir ter feito um sistema que não guarda explicitamente as senhas. Então vamos conseguir nos proteger contra vazamento de dados e, também, vamos conseguir proteger algumas rotas da nossa aplicação.

Então, por exemplo, “criar post”. Um usuário só vai conseguir fazer uma requisição para criar post se ele tiver autenticado. Aqui, neste caso, recebemos um código 401 porque a gente não tem nenhuma autenticação. Então para realizar essa requisição, o que a gente precisa fazer é, primeiro, realizar um login.

E como estamos usando o sistema sem sessões, a gente vai receber um Token, e com esse Token, vamos ter que usar como mais um elemento da sua requisição. E enviando aqui, conseguimos criar um post, conseguimos criar mais de um post usando esse Token.

E a sua aplicação também vai poder verificar se o Token que estamos enviando é válido ou não. Então, por exemplo, se deletarmos um carácter deste Token. Ele envia para a gente que a assinatura está inválida. E se deletarmos outro carácter, aqui no começo, ele vai avisar que o Token está inválido.

Então você também vai entender como o Token em si funciona, para saber a diferença entre esses dois erros. Porque existe a diferença entre esses dois erros.

Além disso, você também não vai só ter um sistema de login, o usuário não vai só poder fazer login no sistema, mas claro, fazer logout desse sistema. Então tendo aqui este Token, podemos criar uma requisição de logout. Então enviando Token , desvinculamos o Token do sistema. Então o próximo post que a gente for criar, ele avisa para gente que o Token foi invadido agora por logout. Então esse vai ser o sistema que você já vai ter feito ao final desse curso.

E para quem é esse curso? Esse curso é para você que tem experiência em construir aplicações em “Node.js” com “Express”, ou se você já viu os cursos da “Alura” introdutório da “Node.js”, e “Node.js Code rest”.

Esse curso também é para você que quer ter um enfoque maior em segurança, para sua aplicação, e quer dar um passo além aprendendo mais sistemas de autenticação e a diferença entre eles, e também, sempre com foco em segurança nesse sistema de autenticação. E aí? Vamos começar? Te vejo no curso.

Protegendo as senhas no banco de dados - Vulnerabilidades do blog

Agora, vamos olhar mais de perto como é que nossa aplicação funciona. Primeiro, vamos abrí-lo em um editor de texto. Nesse caso, estou usando o “Vscode”. Então, abrindo “Vscode” vamos abrir a pasta do nosso projeto, que é “Blog do Código”. Carregando e pronto.

Esse é o nosso projeto. Está com um terminal aqui aberto na pasta, vamos rodá-lo para ver se está tudo funcionando. Com npm start. Tudo certo. Ele está rodando na port 3000. E agora como conseguimos fazer a interação com ele?

Como a nossa aplicação é uma API rest, todas as interações que fazemos com ele são feitas por meio de protocolos http. Então, para isso, eu vou usar um programa “Insomnia” que, na atividade anterior, estará explicado como se faz para instalar e usar. E se esse nas aulas anteriores, nos cursos anteriores, você já viu outros programas como Postman, ele funciona da mesma forma. Eu acho um pouquinho mais didático de fácil de usar.

Então vamos abrir aqui nosso programa, o “Insomnia”. Vou aumentar um pouquinho a tela para ficar mais fácil de ver. Aqui, eu já tenho algumas requisições prontas. Eu vou fazer uma junto com você para entendermos melhor como mexer nesse programa.

Então vamos fazer um “New Request”, lado superior esquerdo na seta. Essa requisição, vamos chamar de “Criar usuário”. Essa requisição vai ser uma requisição com método post e como corpo, um formulário.

O endereço dessa requisição vai ser http://localhost:3000/usuário. E, no corpo da requisição, vamos enviar um nome. Neste caso, vou colocar meu nome, Andrew, um e-mail, neste caso, andrew@alura.com.br e uma senha. Como na nossa aplicação a senha tem uma restrição de tamanho máximo e mínimo, eu vou colocar 123123123 que já abrange e fica tudo certo.

Vamos enviar e pronto, usuário foi criado e recebemos o código 201. Então o que mais que nossa aplicação vai conseguir fazer? Além de criar um usuário, podemos listar usuários. Ok , temos usuários listados, tudo certinho. Podemos deletar usuários que temos na base. Pronto, deletado. No caso, ali deu erro porque o id está errado. Vamos colocar o id: 1 que, como vimos anteriormente, o iddo nosso usuário era 1.

Pronto, deu tudo certo. Além de trabalhar com usuários, conseguimos criar e listar posts. Então vamos criar um novo post que vai receber o título e o conteúdo. Tudo certo, criamos o post. E podemos listar os posts que temos na base.

Vamos criar mais um post aqui, “Autenticação 2”. E agora, vamos testar os dois posts que temos na base. Temos este post com a id: 1 e o post que acabamos de criar, o id:2.

Então tudo isso que conseguimos fazer agora nessa aplicação, ela é bem simples. Agora, vamos ver um pouquinho mais de perto sobre como guardamos os nossos usuários. Em “Listar Usuários” de novo, vemos que guardamos um ID, guardamos um nome, e-mail, e guardamos a senha.

Só que a senha, guardamos em texto puro, na base de dados, sem nenhuma proteção. Então, de alguma forma, se um atacante conseguisse pegar a nossa base de dados ele teria acesso tanto aos e-mails, quanto às senhas dos nossos usuários, e isso é uma falha de segurança bem grave. Precisamos de alguma proteção nessas senhas. E de que forma conseguimos fazer isso?

O que precisamos é de alguma função que receba a nossa senha e transforme para algo aparentemente aleatório. De forma que esse resultado da função, não dê nenhuma informação sobre a senha original. E, além disso, tendo o resultado dessa função, você não consegue recuperar a senha original depois.

E outra coisa que precisamos se tivermos a senha original, conseguimos comparar com o resultado da função. Então podemos apenas guardar o resultado da função na base, e temos certeza de que vamos conseguir comparar com a senha que o nosso usuário for dar no momento de login. Então que tipo de função é essa? Uma função que tem essas propriedades é chamada de “Função de Espalhamento” ou “Função de Hashing”.

Agora que sabemos o que é “Função de Espalhamento” ou “Função de Hashing”, que tipo de funções são adequadas para o nosso uso?

Protegendo as senhas no banco de dados - Funções de hashing

Agora vamos ver qual “Função de Hashing” é a mais adequada para o nosso uso. Existem várias opções de hashings de uso geral no mercado, por exemplo: o MD5 e SHA-256.

Vamos, por exemplo, pegar o SHA-256. Poderíamos usá-lo para receber a nossa senha, e gerar a nossa senha hash. Só que esses tipos de funções de hashings de uso geral tem um problema. Elas são muito rápidas. Isso pode parecer um pouco contra intuitivo, mas, por exemplo, um atacante consegue gerar aproximadamente 50 milhões de hashs por segundo com essa função de hash.

[00:46]Se ele tiver um computador bom e não necessariamente até especializado para fazer esse tipo de operação. Então que ele pode fazer é uma tabela, com os valores da senha e a senha hash, que foi gerada pela senha. E, com isso, se ele tiver acesso a nossa base de dados, o atacante pode pegar a senha hash que está guardada lá de, pela tabela, ele consegue descobrir qual foi a senha que gerou a senha hash.

Então, dessa forma, ele basicamente consegue descobrir a senha do nossos usuários, do mesmo jeito que ele conseguia fazer se não tivesse a proteção usando a nossa função de hash.

Então como que a gente pode fazer para arrumar isso daí? E como esse atacante consegue gerar essas senhas? Ele pode pegar de, na hora de gerar a senha, aplicar o hash nessa senha, ele pega uma lista das 10 milhões de senhas mais comuns que são liberadas todo ano e para cada uma dessas senhas, ele pode fazer a permutação, mudando a sequência dos números, pegando só as consoantes ou mudando a ordem dos termos.

E com isso, ele consegue fazer uma lista de possíveis senhas bem robusta e, facilmente, com um pouco tempo, ele consegue gerar o hash dessa senhas e gerar uma tabela que provavelmente ele vai conseguir senhas dos usuários na base de dados.

Então como que conseguimos fazer para deter esse tipo de ataque? E não só isso, em vez de usar apenas uma tabela com todas as senhas e as senhas hash, ele pode usar uma estrutura de dados um pouquinho mais avançada chamada de “Rainbow Table” ou “Tabela Arco-íris”, onde você consegue guardar basicamente as mesmas informações da da senha hash gerada pela senha, de uma forma que ocupa um pouquinho menos espaço.

Esse tipo de ataque é um ataque muito comum, e é chamado de “Rainbow Table Attack”. Então esse é um ataque que pode fazer com que nossas senhas sejam expostas. Como conseguimos fazer para evitar esse tipo de ataque?

Primeiro, o que precisamos fazer é temperar um pouquinho mais essa função. DE, para isso, modificamos ela para receber uma string aleatória de uso único, ou uma string pseudo-aleatória de uso único. Essa string será chamada de salt, que vem do inglês para “sal”.

Assim, essa função de hash modificada, vai receber a senha, de o salt vai combinar os dois na geração da senha com hash. Então, para isso, então para isso o atacante que quer fazer o mesmo tipo de ataque, vai ter que fazer uma tabela para cada probabilidade de salt.

O que torna inviável o “Rainbow Table Attack”. Torna inviável esse ataque, mas não impossibilita que ele descubra a senha, porque esse salt está atrelado a senha na base de dados, ele tá guardado na base de dados.

Então nesse caso, que o atacante tem acesso ao nosso banco, ele pode basicamente pegar o salt e a senha hash e fazer o mesmo método anterior para gerar possíveis senhas para aplicarmos o hash.

Então, com isso, ele consegue, um por um, descobrir a senha de alguns usuários. Só usando esse mesmo método, acaba ficando um pouquinho mais lento do que a “Rainbow Table Attack”,mas ainda assim, não é impossível ele conseguir quebrar a segurança das senhas na base de dados.

Então o método para resolver esse problema é simplesmente trocando a função de hash para uma função mais específica para esse caso. E, no caso, essa função existe e vai resolver todos os problemas de uma vez.

Porque além de receber a nossa senha, ele vai receber um valor de custo e esse curso vai determinar o quão lento a função vai demorar para executar. Assim a gente consegue controlar a velocidade de execução do algoritmo baseado no poder computacional da época.

Então, quanto maior o custo, mais demorada essa função vai ser para executar. E, conforme os anos passam, os computadores ficam mais rápidos e apenas precisamos aumentar a função de custo, que nosso sistema vai continuar com a mesma segurança.

E além disso, com a biblioteca que a gente vai usar, o salt vai ser gerado automaticamente para nós. Então não precisamos nos preocupar com isso. E essa função é chamada de Bcrypt e na nossa aplicação a gente vai usar a função chamada de Bcrypt.hash. Então vamos ver como conseguimos instalar ela a nossa API.

Sobre o curso Node.js e JWT: autenticação com tokens

O curso Node.js e JWT: autenticação com tokens possui 153 minutos de vídeos, em um total de 46 atividades. Gostou? Conheça nossos outros cursos de Node.JS em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Node.JS acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas