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
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