Hachage mot de passe — PBKDF2-SHA256, 100 000 itérations, sel aléatoire 16 octets (limite maximale Cloudflare Workers). Format stocké : pbkdf2$<sel_hex>$<hash_hex>. Rétrocompatibilité SHA-256 — migration transparente au prochain changement de mot de passe.
JWT — HS256, expiration 7 jours, signé avec JWT_SECRET (variable d'environnement Workers, jamais exposée). Le JWT n'est jamais stocké en base — seul son hash SHA-256 (token_hash) est persisté dans la table sessions.
Sessions — IP, User-Agent, pays et date stockés à chaque login. Nettoyage automatique des sessions expirées. Invalidation totale après reset de mot de passe. Révocation unitaire ou globale depuis Mon Compte.
Identifier-first flow — Le login se déroule en 3 étapes : email (vérification d'existence avec délai constant 80ms anti-timing), mot de passe, 2FA si nécessaire.
2FA email — Code 6 chiffres aléatoire, TTL 10 min en KV, usage unique. Après validation : cookie 2fa_trusted (HttpOnly, SameSite=None, Secure, 30 jours), valeur = SHA-256(userId + ':' + JWT_SECRET) — non forgeable sans la clé serveur. Invalidé au reset de mot de passe.
TOTP (Authenticator) — RFC 6238, HMAC-SHA1, fenêtres T±1 (tolérance 30s). Si activé, remplace le 2FA email. Secret stocké en base, jamais transmis après activation.
Passkeys / WebAuthn — Clé privée stockée dans l'enclave sécurisée de l'appareil, jamais transmise. Vérification par signature cryptographique. Protection anti-replay via compteur. Domaine lié à ledashboard.com — résistant au phishing par construction.
Notifications de connexion — Email automatique à chaque IP inconnue via Resend. Géolocalisation via headers Cloudflare natifs — aucun service tiers.
Rate limiting — login 10 req/15 min · register 5 req/h · reset 3 req/h · 2FA verify 10 req/10 min · passkey auth 10 req/15 min — par IP via Cloudflare KV.