Upgrade to Pro — share decks privately, control downloads, hide ads and more …

You Shall Not Pass - Autenticação na era da Internet

Lucas Santos
February 28, 2019

You Shall Not Pass - Autenticação na era da Internet

Lucas Santos

February 28, 2019
Tweet

More Decks by Lucas Santos

Other Decks in Programming

Transcript

  1. Métodos de autenticação - Basic - Digest - One Time

    Pass (TOTP) - Request Signing - Cookies - OAuth - OpenID - JWT - e mais...
  2. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor HTTP Basic - Autenticação através de

    um header HTTP chamado Authorization - Usuário e senha transmitidos em base64 - Concatenação das credenciais em username:password
  3. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor HTTP Basic: Fluxo Client: - Envia

    uma requisição com o Header Authorization: Basic - Usuário e senhas em encoding base64 separados por ":" - Inclui o usuário no header após Basic - Envia a request - Se receber um outro header WWW-Authenticate vai chamar um prompt para login Server: - Deve responder com o header WWW-Authenticate para logins inválidos
  4. Contras - A cada request o usuário e senha são

    enviados - Usuário e senha não são criptografados - Não existe meio de deslogar o usuário - Não é trivial expirar as credenciais - Usuário ou senha não podem conter ":" - Nenhuma segurança se estiver em sites HTTP (sem SSL)
  5. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor HTTP Digest - Próximo do HTTP

    Basic - Não envia as credenciais em texto puro - Precisa de um Nonce, username, senha, realm produzindo um MD5
  6. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor HTTP Digest: fluxo 1. Cliente faz

    uma requisição para o server, que responde com 401 e um nonce 2. Cliente pega o nonce e monta um hash MD5(user:realm:password:nonce) a. Cliente pode incluir outras informações como URI b. Cliente pode gerar um nonce próprio 3. Server compara o MD5 enviado com sua própria versão gerada com o usuário encontrado
  7. Prós - Não trafega seus dados em texto plano -

    Exige um pouco mais de trabalho para conseguir credenciais - Evita (um pouco) rainbow tables, por conta do nonce
  8. Contras - Muito demorada se comparada com utilização em HTTP

    do Basic - Vulnerável a ataques Man-in-the-middle - Um dos dados sensíveis do usuário precisa ser reversível - Aumenta o número de requests - MD5 não é seguro
  9. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor Cookies - Foi o método padrão

    de autenticação por muito tempo - Armazenamento de sessão do lado do servidor - Utilização de cookies para armazenar o ID desta sessão - O ID da sessão é enviado a cada request
  10. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor Cookies: fluxo 1. Aplicação envia um

    post com usuário e senha para o servidor 2. Servidor autentica usuário e cria uma sessão no banco de dados 3. Servidor envia header Set-Cookie para o client com o ID da sessão 4. Todas as requisições subsequentes são feitas com o cookie
  11. Contras - Armazenado no computador - Cria um estado em

    um protocolo Stateless - O cookie pode ser roubado facilmente - Não funciona bem para SPAs - Não escala bem no server - Requer armazenamento em banco de sessões
  12. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor OAuth: Open Authorization Protocol - Permite

    que uma aplicação se autentique em um servidor como se fosse um usuário - Muito utilizado quando temos que ter terceiros usando nossas APIs (Facebook, Twitter) - Comum em APIs públicas - Delega autorização por escopo
  13. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor OAuth: Fluxo - Define 4 papéis:

    - Dono do recurso (usuário) - Cliente - Servidor de recurso - Servidor de autorização 1. A aplicação solicita autorização 2. Usuário concede autorização 3. Aplicação recebe uma concessão 4. Aplicação requisita um token usando sua identidade e a concessão do usuário 5. Servidor emite um token de acesso 6. Aplicação usa o token para requisitar qualquer dado
  14. Prós - Se você é o cliente, a segurança é

    delegada para outra pessoa - Autorização por escopo - Permissionamento em partes pelo usuário - Facilidade de acesso de APIs de terceiros - Uma vez logado, não é necessário logar novamente
  15. Contras - Se você é o cliente, o sistema de

    autenticação está em poder de terceiros - Complicada implementação - Provedores diferentes possuem modelos diferentes de autenticação - Níveis de privilégios podem criar muito overhead na aplicação
  16. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor JWT - JSON Web Token -

    Token leve, mas com toda a informação necessária - Mutável, sendo possível adicionar mais dados no login - Diminui a quantidade de informação que o servidor precisa buscar - Consiste em um cabeçalho, um payload e uma assinatura - Enviado através do header Authorization com o tipo Bearer
  17. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor JWT - Fluxo 1. Usuário requisita

    o token em um POST com suas credenciais 2. Servidor valida e retorna o token 3. A cada requisição o token deve ser reenviado
  18. Prós - O token é leve - Reduz a quantidade

    de chamadas que devem ser feitas ao servidor - Não é suscetível a Man in the Middle - Possui todas as informações do usuário - Extensível - Controle de expiração simples - Controle de escopo - Pode ser usado entre serviços
  19. Contras - Dificulta mitigação de XSS - Aumenta o tamanho

    da request - Single point of failure no secret - Não é possível gerenciar clientes a partir do servidor - Tamanho do token tende a crescer com o tamanho dos dados
  20. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor OpenID - Usa um provedor de

    identidade para poder validar um usuário - "Logar com..." - Permite SSO utilizando comunicação entre aplicações
  21. /khaosdoctor @_staticvoid lsantos.me @khaosdoctor TOTP - Time Based One-time Passwords

    - Senhas de uso único - Baseadas em tempo - Utilizadas como 2FA - Geralmente acessadas em outro dispositivo
  22. <refs> /khaosdoctor @_staticvoid lsantos.me @khaosdoctor - https://stackoverflow.com/questions/9534602/what-is-the-difference-between-digest-and-basic-aut hentication - https://stackoverflow.com/questions/2384230/what-is-digest-authentication

    - https://en.wikipedia.org/wiki/Digest_access_authentication - https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication - https://blog.risingstack.com/web-authentication-methods-explained/ - https://medium.com/@vivekmadurai/different-ways-to-authenticate-a-web-application-e8f3875c25 4a - https://www.digitalocean.com/community/tutorials/uma-introducao-ao-oauth-2-pt - https://medium.com/trainingcenter/jwt-usando-tokens-para-comunica%C3%A7%C3%A3o-eficiente- cf0551c0dd99 - https://github.com/khaosdoctor/web-authentication-methods - https://medium.freecodecamp.org/how-time-based-one-time-passwords-work-and-why-you-should- use-them-in-your-app-fdd2b9ed43c3