Argon2-cffi: Hash seguro de senhas em Python

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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.

Recommendations