Hashing el token de cookie para un inicio de sesión persistente

1

En un sistema de inicio de sesión , estoy usando un token de cookie por usuario y dispositivo generado aleatoriamente . Una parte de el script tiene este aspecto:

// Generate current device's token
$token = substr(bin2hex(mcrypt_create_iv(200)), 0, 60);

// Include this device's token
$STH = $userDB->prepare("INSERT INTO devices (user_id, token, active) VALUES (?, ?, 1)");
$Res = $STH->execute(array($Id, $token));

if (!$Res)
  throw new Exception("Couldn't store the device in the database");

// To keep users logged in between sessions
$Cookie->email = $email;
$Cookie->token = $token;

Sin embargo, esto implica que si la base de datos fue robada, el atacante podría iniciar sesión como cualquier persona cambiando las cookies . Este es un tema que quiero evitar. Sé que sha256 no es válido para el hashing de contraseña general. Sin embargo, de la cadena de donde viene esto,

$token = substr(bin2hex(mcrypt_create_iv(200)), 0, 60);

¿Es seguro almacenar un hash sha256 del token de alta entropía en la base de datos? ¿O debería utilizar el bcrypt más caro, como con las contraseñas?

    
pregunta Francisco Presencia 02.04.2014 - 00:09
fuente

1 respuesta

1

Mientras tu token sea lo suficientemente largo, creo que estarías bien usando simplemente SHA256. No estoy muy familiarizado con PHP, pero parece que estás creando tokens de 200 de longitud, lo que sería más que suficiente. La razón por la que creo que SHA256 estaría bien es que el espacio de búsqueda para un token de longitud es tan gigantesco que realmente no importa qué tan rápida sea la función de hash. No hay ninguna posibilidad de que sea brutal en ninguna de nuestras vidas.

Sin embargo, desde el punto de vista de la programación, todavía podría recomendar el uso de bcrypt. No estoy seguro de la implementación de PHP, pero el hash Bcrypt es generalmente menos difícil de erradicar que el hash SHA256 directo, lo que hace que sea menos probable que tengas errores en tu sistema. Si está usando bcrypt en otro lugar para la autenticación basada en contraseña, entonces usarlo de manera consistente en lugar de tener dos métodos diferentes para el hashing hace que su sistema sea menos complicado y, por lo tanto, menos propensos a tener errores críticos. Si le preocupa la velocidad, tenga cuidado de no optimizar su sistema demasiado pronto. Implementarlo con bcrypt primero y luego hacer un poco de perfil de su sistema. Si, y solo si identifica su sistema de hash de tokens, se debe pensar en usar SHA256.

    
respondido por el TwentyMiles 02.04.2014 - 17:46
fuente

Lea otras preguntas en las etiquetas