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

Melhores práticas de criptografia

Melhores práticas de criptografia

Em nossos sistemas, frequentemente utilizamos criptografia e suas técnicas para guardar informações sensíveis (como senhas), salvar cookies na máquina dos usuários, gerar access tokens para nossas APIs e outras situações... Mas será que realmente sabemos a diferença de criptografia simétrica para assimétrica? Ou como usar corretamente funções de hashing sem se preocupar com ataques side channel? Isso pode ser a diferença entre ter o seu sistema atacado ou não.

Vinícius Campitelli

November 25, 2021
Tweet

More Decks by Vinícius Campitelli

Other Decks in Technology

Transcript

  1. Sobre mim Vinícius Campitelli Membro do Desenvolvedor na Entusiasta em

    cibersegurança Desenvolvedor há mais de 10 anos PHPSP OTTera
  2. Criptografia é... a prática e o estudo de técnicas para

    comunicação segura na presença de terceiros
  3. Criptografia é... a prática e o estudo de técnicas para

    comunicação segura na presença de terceiros a construção e análise de protocolos que previnam terceiros de ler mensagens privadas
  4. Criptografia é... a prática e o estudo de técnicas para

    comunicação segura na presença de terceiros a construção e análise de protocolos que previnam terceiros de ler mensagens privadas Wikipedia
  5. Criptografia Objetivos principais Confidencialidade só o destinatário autorizado deve ser

    capaz de extrair o conteúdo da mensagem da sua forma cifrada Integridade Autenticidade Não-repúdio
  6. Criptografia Objetivos principais Confidencialidade só o destinatário autorizado deve ser

    capaz de extrair o conteúdo da mensagem da sua forma cifrada Integridade o destinatário deverá ser capaz de verificar se a mensagem foi alterada durante a transmissão Autenticidade Não-repúdio
  7. Criptografia Objetivos principais Confidencialidade só o destinatário autorizado deve ser

    capaz de extrair o conteúdo da mensagem da sua forma cifrada Integridade o destinatário deverá ser capaz de verificar se a mensagem foi alterada durante a transmissão Autenticidade o destinatário deverá ser capaz de verificar que se o remetente é realmente quem diz ser Não-repúdio
  8. Criptografia Objetivos principais Confidencialidade só o destinatário autorizado deve ser

    capaz de extrair o conteúdo da mensagem da sua forma cifrada Integridade o destinatário deverá ser capaz de verificar se a mensagem foi alterada durante a transmissão Autenticidade o destinatário deverá ser capaz de verificar que se o remetente é realmente quem diz ser Não-repúdio não deverá ser possível ao remetente negar a autoria de sua mensagem
  9. Criptografia Objetivos principais Confidencialidade só o destinatário autorizado deve ser

    capaz de extrair o conteúdo da mensagem da sua forma cifrada Integridade o destinatário deverá ser capaz de verificar se a mensagem foi alterada durante a transmissão Autenticidade o destinatário deverá ser capaz de verificar que se o remetente é realmente quem diz ser Não-repúdio não deverá ser possível ao remetente negar a autoria de sua mensagem Wikipedia
  10. Criptografia Simétrica Usa a mesma chave para os dois processos

    Portanto, essa chave deve permanecer secreta
  11. Criptografia Simétrica Cifras de Bloco Operam com tamanho fixos de

    blocos de informação Cifras de Fluxo Trabalham com qualquer stream de bits
  12. Criptografia Simétrica › Cifras de Bloco Algoritmos mais comuns Blowfish

    deve-se usar os algoritmos relacionados Twofish and Threefish, por serem mais seguros
  13. Criptografia Simétrica › Cifras de Bloco Algoritmos mais comuns Blowfish

    deve-se usar os algoritmos relacionados Twofish and Threefish, por serem mais seguros DES Data Encryption Standard que não deve ser usado mais (e nem o seu successor Triple DES)
  14. Criptografia Simétrica › Cifras de Bloco Algoritmos mais comuns Blowfish

    deve-se usar os algoritmos relacionados Twofish and Threefish, por serem mais seguros DES Data Encryption Standard que não deve ser usado mais (e nem o seu successor Triple DES) AES Advanced Encryption Standard também conhecido pelo seu nome original Rijndael, foi aprovado pelo NSA para encriptar informações confidenciais e é o mais recomendado
  15. Criptografia Simétrica › Cifras de Bloco Modos de Operação Processo

    que será responsável por executar a cifra em cada um dos blocos
  16. Criptografia Simétrica › Cifras de Bloco Modos de Operação O

    Vetor de Inicialização (IV) é um valor aleatório responsável por oferecer o estado inicial ao algoritmo e não pode ser reutilizado ou previsível
  17. Criptografia Simétrica › Cifras de Bloco Modos de Operação Principais

    algoritmos Electronic codebook (ECB) Cipher block chaining (CBC) Cipher feedback (CFB) Counter (CTR) Galois/counter mode (GCM) Counter with cipher block chaining MAC (CCM)
  18. Criptografia Simétrica › Cifras de Bloco Por que não: CBC,

    CFB e CTR Não oferecem integridade e autenticidade
  19. Criptografia Simétrica › Cifras de Bloco Por que não: CBC,

    CFB e CTR Não oferecem integridade e autenticidade Ou seja, não é possível saber se alguém alterou ou forjou a mensagem
  20. Criptografia Simétrica › Cifras de Bloco Por que não: CBC,

    CFB e CTR Não oferecem integridade e autenticidade Ou seja, não é possível saber se alguém alterou ou forjou a mensagem Iremos saber mais ao falar de hashing
  21. Criptografia Simétrica › Cifras de Bloco Modos de Operação Algoritmos

    Galois/counter (GCM) Counter with cipher block chaining MAC (CCM) Electronic codebook (ECB) Cipher block chaining (CBC) Cipher feedback (CFB) Counter (CTR)
  22. Criptografia Simétrica › Cifras de Bloco Modos de Operação Algoritmos

    Galois/counter (GCM) Counter with cipher block chaining MAC (CCM) Electronic codebook (ECB) Cipher block chaining (CBC) Cipher feedback (CFB) Counter (CTR)
  23. Criptografia Simétrica › Cifras de Bloco Modos de Operação Algoritmos

    Galois/counter (GCM) Counter with cipher block chaining MAC (CCM) Electronic codebook (ECB) Cipher block chaining (CBC) Cipher feedback (CFB) Counter (CTR)
  24. Criptografia Simétrica › Cifras de Bloco Exemplo: GCM PHP $iv

    = random_bytes( openssl_cipher_iv_length('aes-256-gcm') ); $ciphertext = openssl_encrypt( $data, // plaintext 'aes-256-gcm', // cipher $key, // key OPENSSL_RAW_DATA, // flags $iv, // iv (nonce) $tag, // tag $aad, // AAD 16 // tag length ); $message = base64_encode($iv . $tag . $ciphertext); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  25. Criptografia Simétrica › Cifras de Bloco Exemplo: GCM const {

    readFileSync } = require('fs'); const { createCipheriv, randomBytes } = require('crypto'); const key = readFileSync('app.key').toString().trim(); const nonce = randomBytes(12); const cipher = createCipheriv('aes-256-gcm', key, nonce, { authTagLength: 16 }); const ciphertext = cipher.update(plaintext, 'utf8'); cipher.final(); const tag = cipher.getAuthTag(); const message = Buffer .concat([nonce, tag, ciphertext]) .toString('hex'); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 scripts/symmetric/node-gcm-encrypt.js
  26. Criptografia Simétrica Cifras de Fluxo Indicadas quando não se sabe

    o tamanho do dado A5/1 usada no padrão GSM para comunicação móvel
  27. Criptografia Simétrica Cifras de Fluxo Indicadas quando não se sabe

    o tamanho do dado A5/1 usada no padrão GSM para comunicação móvel RC4 usada no protocolo WEP para redes wireless
  28. Criptografia Simétrica Cifras de Fluxo Indicadas quando não se sabe

    o tamanho do dado A5/1 usada no padrão GSM para comunicação móvel RC4 usada no protocolo WEP para redes wireless ChaCha a mais recomendada para uso hoje em dia
  29. Criptografia Simétrica Onde armazenar a chave? Melhor opção é usar

    solução de hardware, mas pode ser caro e não estar disponível na infraestrutura Exemplos: HSM (Hardware Security Module) e TPM (Trusted Platform Module)
  30. Criptografia Simétrica Onde armazenar a chave? Serviços do seu provedor

    de Cloud Exemplos: AWS Key Management Service e Google Cloud Key Management
  31. Criptografia Simétrica Onde armazenar a chave? Para Kubernetes ou Swarm,

    checar as features de Secrets PS: o Kubernetes não criptografa os dados por padrão, então siga o artigo Encrypting Secret Data at Rest
  32. Criptografia Simétrica Onde armazenar a chave? também é uma alternativa

    e acompanha o versionamento do seu código git-secret
  33. Criptografia Simétrica Onde armazenar a chave? Dependendo da criticidade da

    aplicação, você pode dividir a chave e colocar cada parte em uma localização diferente
  34. Criptografia Assimétrica Utiliza duas chaves, sendo cada uma responsável por

    um dos processos Chave Pública Pode ser distribuída para outros Chave Privada
  35. Criptografia Assimétrica Utiliza duas chaves, sendo cada uma responsável por

    um dos processos Chave Pública Pode ser distribuída para outros Chave Privada Deve permanecer com o portador
  36. Criptografia Assimétrica Utiliza duas chaves, sendo cada uma responsável por

    um dos processos Chave Pública Pode ser distribuída para outros Chave Privada Deve permanecer com o portador Também conhecida como Criptografia de chave pública
  37. Criptografia Assimétrica Se você quer que terceiros se comuniquem com

    você... Chave Pública Chave Privada Usada por eles para escrevem para você
  38. Criptografia Assimétrica Se você quer que terceiros se comuniquem com

    você... Chave Pública Chave Privada Usada por eles para escrevem para você Usada por você para ler o texto recebido
  39. Criptografia Assimétrica Se você quer que terceiros se comuniquem com

    você... Chave Pública Chave Privada Usada por eles para escrevem para você ↓ Encriptação Usada por você para ler o texto recebido ↓ Decriptação
  40. Criptografia Assimétrica Se você quiser se comunicar com outros... Chave

    Pública Chave Privada Usada por você para escrever textos
  41. Criptografia Assimétrica Se você quiser se comunicar com outros... Chave

    Pública Chave Privada Usada por eles para verificar se o texto realmente veio de você Usada por você para escrever textos
  42. Criptografia Assimétrica Se você quiser se comunicar com outros... Chave

    Pública Chave Privada Usada por eles para verificar se o texto realmente veio de você ↓ Decriptação Usada por você para escrever textos ↓ Encriptação
  43. Criptografia Assimétrica Mas como pode uma chave ser usada para

    ler e outra para escrever? O RSA, algoritmo bastante conhecido, depende de números semi-primos (que são aqueles com exatamente dois números primos como fatores) muito grandes A segurança desse algoritmo consiste na dificuldade computacional em fatorar esses números
  44. Criptografia Assimétrica Mas como pode uma chave ser usada para

    ler e outra para escrever? Outros algoritmos (como ED25519) são baseados em curvas elípticas: pontos gerados por equações cúbicas como y² = x³ + ax + b Nesses casos, o cálculo do logaritmo discreto ainda é muito custoso computacionalmente
  45. Criptografia Assimétrica Mas como pode uma chave ser usada para

    ler e outra para escrever? Em ambos os casos, a segurança se baseia no fato das operações reversas serem muito custosas com o poder computacional existente
  46. Criptografia Assimétrica Mas como pode uma chave ser usada para

    ler e outra para escrever? Em ambos os casos, a segurança se baseia no fato das operações reversas serem muito custosas com o poder computacional existente Já existem estudos de criptografia pós-quântica para resistirem a ataques de computadores quânticos
  47. Criptografia Assimétrica Abordagem híbrida Na prática, por causa de limitações

    do tamanho do texto a ser cifrado em alguns algoritmos (como no RSA, que com chaves de 2048 bits só permite cifrar blocos de até 214 bytes) e por serem mais lentos na maioria dos casos, o que geralmente acontece é:
  48. Criptografia Assimétrica Abordagem híbrida 1. É gerada uma chave secreta

    (aleatória e única para a sessão); 2. Usa-se Criptografia Simétrica para criptografar o texto plano;
  49. Criptografia Assimétrica Abordagem híbrida 1. É gerada uma chave secreta

    (aleatória e única para a sessão); 2. Usa-se Criptografia Simétrica para criptografar o texto plano; 3. Usa-se Criptografia Assimétrica para criptografar a chave gerada.
  50. Criptografia Assimétrica Exemplo - RSA const crypto = require('crypto'); const

    publicKey = crypto.createPublicKey( fs.readFileSync('/path/to/public.key').toString() ); const encryptedData = crypto.publicEncrypt( { key: publicKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha512', }, Buffer.from(message) ); console.log(encryptedData.toString('hex')); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 scripts/asymmetric/node-rsa-encrypt.js
  51. Criptografia Assimétrica Exemplo - RSA const crypto = require('crypto'); const

    privateKey = crypto.createPrivateKey( fs.readFileSync('/path/to/private.key').toString() ); const decryptedData = crypto.privateDecrypt( { key: privateKey, padding: crypto.constants.RSA_PKCS1_OAEP_PADDING, oaepHash: 'sha512', }, Buffer.from(message, 'hex') ); console.log(decryptedData.toString); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 scripts/asymmetric/node-rsa-decrypt.js
  52. Hashing Integridade + Autenticidade Apenas criptografar sem fazer o hash

    não é o suficiente, pois algum agente malicioso pode alterar a mensagem
  53. O que um sistema que rode o código a seguir

    pode dar de informação a um atacante?
  54. function login(username, password) { const user = this.findByUsername(username); if (!user)

    { return false; } if (!this.verifyPassword(password, user.password)) { return false; } return true; } 1 2 3 4 5 6 7 8 9 10 11 12
  55. Timing Attacks ataque no qual um atacante tenta comprometer um

    sistema criptográfico analisando o tempo gasto para executar determinados algoritmos
  56. Timing Attacks ataque no qual um atacante tenta comprometer um

    sistema criptográfico analisando o tempo gasto para executar determinados algoritmos Wikipedia
  57. Timing Attacks Código resistente a timing attacks function login(username, password)

    { const user = this.findByUsername(username); // this.generateFakePassword = () => 'abcdefg123456' let storedPassword = this.generateFakePassword(); if (user !== null) { storedPassword = user.password; } return (this.verifyPassword(password, storedPassword)) && (user !== null); } 1 2 3 4 5 6 7 8 9 10 11 12
  58. Timing Attacks Hashing Exercício: criar um algoritmo para comparar duas

    strings 1. A primeira coisa é comparar o tamanho delas
  59. Timing Attacks Hashing Exercício: criar um algoritmo para comparar duas

    strings 1. A primeira coisa é comparar o tamanho delas 2. Se os tamanhos forem diferentes, retorna false
  60. Timing Attacks Hashing Exercício: criar um algoritmo para comparar duas

    strings 1. A primeira coisa é comparar o tamanho delas 2. Se os tamanhos forem diferentes, retorna false 3. Se forem iguais, você irá comparar letra por letra
  61. Timing Attacks Hashing Exercício: criar um algoritmo para comparar duas

    strings 1. A primeira coisa é comparar o tamanho delas 2. Se os tamanhos forem diferentes, retorna false 3. Se forem iguais, você irá comparar letra por letra 4. Assim que houver uma letra diferente, retorna false
  62. Timing Attacks Hashing Exercício: criar um algoritmo para comparar duas

    strings 1. A primeira coisa é comparar o tamanho delas 2. Se os tamanhos forem diferentes, retorna false 3. Se forem iguais, você irá comparar letra por letra 4. Assim que houver uma letra diferente, retorna false 5. Se chegou até o final da comparação, retorna true
  63. Timing Attacks Hashing Exercício: criar um algoritmo para comparar duas

    strings Cada uma das comparações do item 4. irá levar um certo tempo, que chamaremos de 1u (que provavelmente serão alguns milésimos de segundo)
  64. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u
  65. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u
  66. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u
  67. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u d é igual a d 4u
  68. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u d é igual a d 4u e é igual a e 5u
  69. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u d é igual a d 4u e é igual a e 5u
  70. Então, para comparar as strings abcdef e abcdef ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u d é igual a d 4u e é igual a e 5u f é igual a f 6u
  71. Agora, para comparar as strings abcdef e abcdxf ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u
  72. Agora, para comparar as strings abcdef e abcdxf ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u
  73. Agora, para comparar as strings abcdef e abcdxf ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u
  74. Agora, para comparar as strings abcdef e abcdxf ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u d é igual a d 4u
  75. Agora, para comparar as strings abcdef e abcdxf ... Comparação

    Tempo decorrido Tamanhos são iguais - a é igual a a 1u b é igual a b 2u c é igual a c 3u d é igual a d 4u e é igual a x 5u
  76. Timing Attacks Hashing Use comparações de tempo constante entre hashes

    // Ao invés de if ($hash1 === $hash2) { if (hash_equals($hash1, $hash2)) { // ... } PHP
  77. Timing Attacks Hashing Use comparações de tempo constante entre hashes

    const { timingSafeEqual } = require('crypto'); const buffer1 = Buffer.from('hash1'); const buffer2 = Buffer.from('hash2'); // Ao invés de if (buffer1.equals(buffer2)) { let check = false; try { check = timingSafeEqual(buffer1, buffer2); } catch (err) { // false } Node.js
  78. Armazenamento de Senhas Você deve usar algoritmos de hashing ao

    invés de encriptação Em ordem de recomendação:
  79. Armazenamento de Senhas Você deve usar algoritmos de hashing ao

    invés de encriptação Em ordem de recomendação: 1. Argon2ID
  80. Armazenamento de Senhas Você deve usar algoritmos de hashing ao

    invés de encriptação Em ordem de recomendação: 1. Argon2ID 2. bcrypt
  81. Armazenamento de Senhas Você deve usar algoritmos de hashing ao

    invés de encriptação Em ordem de recomendação: 1. Argon2ID 2. bcrypt 3. PBKDF2
  82. Armazenamento de Senhas Exemplo // Para salvar public function setPassword(string

    $password): string { return \password_hash($password, PASSWORD_ARGON2ID); } // Para verificar public function checkPassword(User $user, string $password): bool { return \password_verify($password, $user->getPassword()); } 1 2 3 4 5 6 7 8 9 PHP
  83. Armazenamento de Senhas Exemplo const argon2 = require('argon2'); try {

    // Para salvar const hash = await argon2.hash( password, { type: argon2.argon2id } ); // Para verificar if (await argon2.verify(hash, password)) { // ... } } catch (err) { // algum erro } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Node.js (pacote argon2)
  84. Armazenamento de Senhas Bibliotecas e leitura Password Storage Cheat Sheet

    Secure Salted Password Hashing defuse/password-hashing
  85. Referências Leitura Wikipedia: Criptoanálise Wikipedia: Diffie–Hellman key exchange OWASP Cheat

    Sheet Series FIPS 140-3 (Security Requirements for Cryptographic Modules) Paragon Initiative
  86. Workshops de TI Gostou? Então conheça meus treinamentos corporativos sobre

    Desenvolvimento, Segurança da Informação, DevOps, Arquitetura de Sistemas e diversos outros assuntos cd git/ bit.ly/vcampitelli-workshops