Slide 1

Slide 1 text

Python Cryptography Dann Luciano 1

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Dann Luciano 3

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

AVISO!!! 5

Slide 6

Slide 6 text

Aviso 1 Use por sua Conta e Risco! 6

Slide 7

Slide 7 text

Aviso 2 Tudo possui um Custo 7

Slide 8

Slide 8 text

Aviso 3 Fuja de soluções Mágicas 8

Slide 9

Slide 9 text

Python 9 + Criptografia cryptography

Slide 10

Slide 10 text

https://cryptography.io

Slide 11

Slide 11 text

Cryptography Biblioteca Padrão de Criptografia 11

Slide 12

Slide 12 text

pip install cryptography 12

Slide 13

Slide 13 text

Porque Cryptography? Suporte para PyPy, Python 3 e OS (Win, Linux, *nix). 13

Slide 14

Slide 14 text

Porque Cryptography? Criptografia para Humanos 14

Slide 15

Slide 15 text

Porque Cryptography? Implementação dos Algoritmos AES-GCM e HKDF. 15

Slide 16

Slide 16 text

Porque Cryptography? Bons Valores Padrões 16

Slide 17

Slide 17 text

Levels 17

Slide 18

Slide 18 text

Level 1 Criptografia para Humanos 18

Slide 19

Slide 19 text

Level 2 Baixo Nível 19

Slide 20

Slide 20 text

Criptografia 20

Slide 21

Slide 21 text

RSA, AES, BCrypt, 3DES, DES, MD5, HMAC, Scrypt, Private Keys, Public Keys, SHA1, SHA256, SHA512 21

Slide 22

Slide 22 text

22 “Python Nordeste” “Au!g64dhsUI#4&(*a”

Slide 23

Slide 23 text

Criptografia Assimétrica e Simétrica 23

Slide 24

Slide 24 text

Fernet Criptografia Simétrica Autenticada 24

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

Usando Fernet from cryptography.fernet import Fernet key = Fernet.generate_key() f = Fernet(key) token = f.encrypt(b"my deep dark secret") f.decrypt(token) 26

Slide 27

Slide 27 text

Formato da Chave Fernet 27

Slide 28

Slide 28 text

Formato da Chave Fernet Chave de Assinatura + Chave de Criptografia (128 bits) 28

Slide 29

Slide 29 text

Formato da Chave Fernet 'senha super mega hyper boladonaaaaaaaaaaaaa’ 32 Bytes ou 256 Bits 29

Slide 30

Slide 30 text

Formato da Chave Fernet c2VuaGEgc3VwZXIgbWVnYSBoeXBlciBib2xhZG9uYW FhYWFhYWFhYWFhYQ== 30

Slide 31

Slide 31 text

Formato Token Fernet 31

Slide 32

Slide 32 text

Formato Token Fernet Versão + Timestamp + IV + Texto Cifrado + HMAC 32

Slide 33

Slide 33 text

Formato Token Fernet Versão, 8 bits 33

Slide 34

Slide 34 text

Formato Token Fernet Timestamp, 64 bits 34

Slide 35

Slide 35 text

Formato Token Fernet IV, 128 bits 35

Slide 36

Slide 36 text

Formato Token Fernet Texto Cifrado, tamanho variado, mas múltiplo de 128 bits 36

Slide 37

Slide 37 text

Formato Token Fernet HMAC, 256 bits 37

Slide 38

Slide 38 text

Formato Token Fernet Versão + Timestamp + IV + Texto Cifrado + HMAC 38

Slide 39

Slide 39 text

Formato Token Fernet 0x80 00000000 5736243B10BC653D ... 261B737ECB120A22DFD8059CEF155FB8 39

Slide 40

Slide 40 text

Formato Token Fernet 0x80 00000000 5736243B10BC653D ... 261B737ECB120A22DFD8059CEF155FB8 40

Slide 41

Slide 41 text

Formato Token Fernet 0x80 00000000 5736243B10BC653D ... 261B737ECB120A22DFD8059CEF155FB8 41

Slide 42

Slide 42 text

Formato Token Fernet 0x80 00000000 5736243B10BC653D ... 261B737ECB120A22DFD8059CEF155FB8 42

Slide 43

Slide 43 text

Formato Token Fernet 0x80 00000000 5736243B10BC653D ... 261B737ECB120A22DFD8059CEF155FB8 43

Slide 44

Slide 44 text

Geração Fernet Token 1. Guardo o Tempo Corrente 2. Escolho um IV único 3. Criptografo a mensagem usando o AES 128 no modo CBC com IV e Chave de Criptografia. 4. Computo o HMAC usando a Chave de Assinatura. 5. Concateno Todos dos Campos 6. Codifico o Token usando base64url 44

Slide 45

Slide 45 text

Verificação Fernet Token 1. Decodifico o Token usando base64url. 2. Verifico se o Primeiro Byte do Token é 0x80. 3. Verifico se Tempo Corrente não é muito maior que o Tempo Corrente do Token. 4. Computo o HMAC usando a Chave de Assinatura. 5. Verifico se o HMAC é igual ao HMAC do Token 6. Descriptografo a mensagem usando o AES 128 no modo CBC com o IV e Chave de Criptografia. 45

Slide 46

Slide 46 text

Usando MultiFernet from cryptography.fernet import Fernet, MultiFernet key1 = Fernet(Fernet.generate_key()) key2 = Fernet(Fernet.generate_key()) f = MultiFernet([key1, key2]) token = f.encrypt(b"Secret message!") f.decrypt(token) 46

Slide 47

Slide 47 text

Finalizando 47

Slide 48

Slide 48 text

Criptografia é "Simples" 48

Slide 49

Slide 49 text

Gerenciamento de Chaves é Complexo 49

Slide 50

Slide 50 text

Buscas vão quebrar no Banco de Dados 50

Slide 51

Slide 51 text

Hashes podem Ajudar SHA256 51

Slide 52

Slide 52 text

Usem HTTPS 52

Slide 53

Slide 53 text

Muito Obrigado! 53 ? https://speakerdeck.com/dannluciano [email protected]