Derivação de chave
Uma função de derivação transforma uma senha (mais um sal) numa chave de tamanho fixo, de propósito devagar.
Cifras como o AES precisam de uma chave de tamanho exato, por exemplo 32 bytes para o AES-256. Gente não decora 32 bytes aleatórios; decora senhas. A função de derivação de chave (KDF, de key derivation function) faz a ponte: recebe a senha e devolve quantos bytes forem pedidos.
Os ingredientes de uma KDF baseada em senha, como o PBKDF2:
| Ingrediente | Para que serve |
|---|---|
| Senha | O segredo que a pessoa sabe |
| Sal | Um valor extra, em geral aleatório e guardado junto com o resultado. A mesma senha com sais diferentes dá chaves diferentes, e tabelas pré-calculadas deixam de servir |
| Função de hash | O PBKDF2 repete um HMAC, por exemplo com SHA-256 |
| Iterações | Quantas vezes repetir. Milhares de rodadas deixam cada tentativa de adivinhar a senha mais cara |
| Tamanho | Quantos bytes sair. Às vezes se pede mais e se divide: 32 de chave e 16 de IV (o vetor de inicialização do modo CBC) |
Em Python:
import hashlib
km = hashlib.pbkdf2_hmac('sha256', b'senha', b'sal', 100000, 48)
chave, iv = km[:32], km[32:]
Uma KDF não protege uma senha que vazou: quem tem a senha, o sal e os parâmetros calcula a mesma chave. Ela só deixa a adivinhação mais lenta. Outras KDFs conhecidas são o scrypt e o Argon2. O openssl enc, sem a opção -pbkdf2, usa uma derivação antiga, o EVP_BytesToKey, com uma única rodada de hash, e o próprio OpenSSL avisa deprecated key derivation used. Quando um documento só diz "uma KDF padrão", teste as combinações comuns e confira se o texto decifrado tem preenchimento válido e faz sentido.