O que é argon2-cffi
A biblioteca argon2-cffi é um wrapper oficial em Python para o algoritmo de hash de senhas Argon2, implementado através da interface CFFI (C Foreign Function Interface). O Argon2 é um algoritmo moderno de hash de senhas que venceu a competição Password Hashing Competition em 2015 e, desde então, é considerado o padrão ouro para armazenamento seguro de senhas.
A principal vantagem do argon2-cffi é que ele oferece alta performance graças à implementação em C, ao mesmo tempo que fornece uma interface Python amigável. A biblioteca é ativamente mantida pela comunidade e atualizada regularmente de acordo com os padrões de segurança mais recentes.
Instalação e configuração
Instalação padrão
pip install argon2-cffi
Instalação com dependências adicionais
pip install argon2-cffi[dev] # para desenvolvimento
pip install argon2-cffi[tests] # para testes
Verificando a instalação
import argon2
print(argon2.__version__)
Variantes do algoritmo Argon2
Argon2i (Data-Independent)
O Argon2i é otimizado para proteção contra ataques de canal lateral (side-channel attacks). Ele acessa a memória independentemente do conteúdo da senha, tornando-o resistente a ataques de tempo de execução. É recomendado para cenários onde a proteção contra análise de tempo de execução é importante.
Argon2d (Data-Dependent)
O Argon2d oferece máxima proteção contra ataques de GPU e ataques com hardware especializado. Ele usa acessos à memória dependentes de dados, dificultando o paralelismo de ataques. No entanto, é menos protegido contra ataques de canal lateral.
Argon2id (Híbrido)
O Argon2id é um modo híbrido que combina as vantagens de ambas as variantes. Ele é usado por padrão no argon2-cffi e é recomendado para a maioria dos casos de uso. As primeiras passagens são executadas como Argon2i e as restantes como Argon2d.
Início rápido
Uso básico
from argon2 import PasswordHasher
# Criando uma instância do hasher
ph = PasswordHasher()
# Fazendo hash de uma senha
password = "minha_senha_super_secreta"
hash_result = ph.hash(password)
print(f"Hash: {hash_result}")
# Verificando a senha
try:
ph.verify(hash_result, password)
print("Senha correta!")
except Exception as e:
print(f"Senha incorreta: {e}")
Trabalhando com diferentes tipos de dados
from argon2 import PasswordHasher
ph = PasswordHasher()
# Fazendo hash de uma string
string_hash = ph.hash("senha_string")
# Fazendo hash de bytes
bytes_password = b"senha_bytes"
bytes_hash = ph.hash(bytes_password)
# Verificando
ph.verify(string_hash, "senha_string")
ph.verify(bytes_hash, bytes_password)
Configuração do PasswordHasher
Parâmetros do construtor
from argon2 import PasswordHasher, Type
ph = PasswordHasher(
time_cost=3, # Número de iterações (padrão: 2)
memory_cost=65536, # Memória em KB (padrão: 51200)
parallelism=2, # Número de threads (padrão: 1)
hash_len=32, # Tamanho do hash em bytes (padrão: 32)
salt_len=16, # Tamanho do salt em bytes (padrão: 16)
encoding="utf-8", # Codificação (padrão: "utf-8")
type=Type.ID # Tipo Argon2 (padrão: Type.ID)
)
Impacto dos parâmetros na segurança
time_cost aumenta o tempo de execução linearmente. Cada incremento de 1 dobra o tempo de hash.
memory_cost define a quantidade de memória em kilobytes. Valores maiores dificultam ataques com hardware especializado.
Também na biblioteca
Recommendations