2011-12-14 9 views
6

Estoy tratando de implementar un "remember me" característica, siguiendo las directrices proporcionadas aquí: The definitive guide to form-based website authentication, y aquí: http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice/mejor manera para hash un "yo recuerde" cookie símbolo

Parece ser que el " cookie token "debe ser hash cuando se almacena en DB (si un atacante tiene acceso a DB, los tokens no desfasados ​​se ven como login/contraseñas simples, lo que permite iniciar sesión en el sitio web).

Buscando un buen algoritmo de hash, he encontrado esta técnica recomendada utilizando bcrypt: https://stackoverflow.com/a/6337021/488666

Yo lo he probado y se encontró que con la cantidad de rondas propuesto (15) conduce a una muy tiempo de procesamiento lento (2,3s de hash + 2,3s verificar en un procesador Intel Core 2 Duo E8500 + 4 GB de RAM)

sé que algoritmos hash deben ser relativamente lento para obstaculizar los atacantes, pero a ese nivel, que obstaculiza usuarios para usar el sitio web :)

¿Crees que hay menos rondas (p. 7, que reduce el tiempo de procesamiento a 10 ms + 10 ms) será suficiente?

+0

posible duplicado de [¿Cuál es la mejor manera de implementar "recordarme" para un sitio web?] (Http://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement- Remember-me-for-a-website) – symcbean

+0

Usar un hash es una pérdida de tiempo costosa para esto: use un valor aleatorio – symcbean

+0

Los documentos/artículos recomendados/artículos de la mejor práctica recomiendan encarecidamente el token del token en DB; Simplemente estoy buscando consejos sobre una forma apropiada de hacerlo. –

Respuesta

13

Citando The definitive guide to form-based website authentication:

No almacene el cookie de conexión persistente (TOKEN) en su base, sólo un hash de TI! El token de inicio de sesión es Equivalente de contraseña, por lo que si un atacante tiene en sus manos su base de datos, podría usar los tokens para iniciar sesión en en cualquier cuenta, como si fueran combinaciones de inicio de sesión claras . Por lo tanto, utilice hashing salado fuerte (bcrypt/phpass) cuando almacene tokens de inicio de sesión persistentes.

Acepto la primera frase en negrita, pero no la última.

Si no me equivoco, el propósito de un algoritmo de "hash salado fuerte" es que alguien no debería ser capaz de recuperar las contraseñas dada una tabla rainbow.

Pero aquí, la cadena hash no es una contraseña sino una cadena aleatoria . Por lo tanto, es bastante improbable que cualquier tabla de arcoiris pueda recuperar cualquier cadena con hash original. Incluso supongo que simplemente podría usar una llamada básica hash('sha256', $randomString) para esto, el objetivo es tener diferentes valores para el token en el DB y en la cookie.

Cuestiones relacionadas