Attualmente sto studiando i protocolli di autenticazione utente per un sito Web che sto sviluppando. Vorrei creare un cookie di autenticazione in modo che gli utenti possano rimanere loggati tra le pagine.
Ecco la mia prima battuta:
cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
Dove k è HMAC(user_id|expiry_date, sk)
e sk è una chiave a 256 bit nota solo al server. HMAC è un hash SHA-256. Nota che '|' è un separatore, non solo una concatenazione.
Questo sembra in PHP (nota, questa domanda è indipendente dalla lingua, PHP è solo un esempio):
$key = hash_hmac('sha256', $user_id . '|' . $expiry_time, SECRET_KEY);
$digest = hash_hmac('sha256', $user_id . '|' . $expiry_time, $key);
$cookie = $user_id . '|' . $expiry_time . '|' . $digest;
Riesco a vedere che è vulnerabile a Replay Attacks come indicato in Un Secure Cookie Protocol , ma dovrebbe essere resistente agli attacchi Volume e allo spionaggio crittografico.
LA QUESTIONE: Sono sulla buona linea qui, o c'è una vulnerabilità enorme che mi è sfuggita? C'è un modo per difendersi da Replay Attack che funziona con indirizzi IP assegnati dinamicamente e non usa le sessioni? Non voglio archiviare nulla sul lato server per avere questo lavoro.
Inoltre, non sto pianificando o rotolando da solo. Sto chiedendo questo per giudicare meglio quale soluzione dovrei scegliere. Quindi nessuna risposta "Basta usare X" senza una spiegazione.
NOTE
Il materiale più recente che ho letto:
Dos e cosa non fare dell'autenticazione client sul Web
alias Fu et al.
( link )
Un protocollo per cookie protetto
alias Liu et al.
( link )
che si espande sul metodo precedente
Cookie di sessione stateless indurito
( link )
che si espande anche sul metodo precedente.
Dato che l'argomento è estremamente complicato, sto cercando solo risposte dagli esperti di sicurezza con esperienza del mondo reale nella creazione e nell'interruzione degli schemi di autenticazione.