Actualmente estoy investigando los protocolos de autenticación de usuarios para un sitio web que estoy desarrollando. Me gustaría crear una cookie de autenticación para que los usuarios puedan permanecer conectados entre páginas.
Aquí está mi primera fiesta:
cookie = user_id|expiry_date|HMAC(user_id|expiry_date, k)
Donde k es HMAC(user_id|expiry_date, sk)
y sk es una clave de 256 bits que solo conoce el servidor. HMAC es un hash SHA-256. Tenga en cuenta que '|' Es un separador, no solo de concatenación.
Esto se parece a esto en PHP (Nota, esta pregunta es independiente del lenguaje, PHP es solo un ejemplo):
$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;
Puedo ver que es vulnerable a los ataques de reproducción como se indica en A Secure Cookie Protocol , pero debería ser resistente a los ataques de volumen y al empalme criptográfico.
LA PREGUNTA: ¿Estoy en la línea correcta aquí, o hay una vulnerabilidad masiva que me he perdido? ¿Hay alguna forma de defenderse contra los ataques de reproducción que funcionan con direcciones IP asignadas dinámicamente y que no usan sesiones? No quiero almacenar nada en el lado del servidor para que funcione.
Además, no estoy planeando o haciendo rodar la mía. Estoy pidiendo esto para juzgar mejor qué solución debo elegir. Así que no hay respuestas de "solo usa la solución X" sin algún tipo de explicación.
NOTAS
El material más reciente que he leído:
Qué hacer y qué no hacer con la autenticación del cliente en la Web
alias fu et al.
( enlace )
Un protocolo de cookie seguro
aka Liu et al.
( enlace )
que se expande en el método anterior
Cookies de sesión sin estado reforzadas
( enlace )
que también se expande en el método anterior.
Como el tema es extremadamente complicado, solo busco respuestas de expertos en seguridad con experiencia en el mundo real para crear y romper esquemas de autenticación.