Hola, en primer lugar, permítanme decir, no estoy preguntando por cosas como MD5 (MD5 (..., ya hay temas al respectocontraseñas doble dispersión - cliente y servidor
Mi pregunta es la siguiente:.
Permitimos que nuestros clientes almacenen sus contraseñas localmente. Naturalmente, no queremos que estén almacenadas en el texto del plan, por lo que las procesamos localmente, antes de almacenarlas y enviarlas. Ahora, esto está bien, pero si esto es así todo lo que hicimos, entonces el servidor tendría el hmac almacenado, y como el cliente solo debe enviar el hmac, no la contraseña de texto plano, un atacante podría usar los hashes almacenados del servidor para acceder a la cuenta de cualquier persona (en el escenario catastrófico donde alguien tendría acceso a los datos e, por supuesto).
Por lo tanto, nuestra idea era codificar la contraseña en el cliente una vez a través de hmac, enviarla al servidor, codificarla por segunda vez a través de hmac y hacerla coincidir con la contraseña almacenada, dos veces hmac'ed. Esto garantizaría que:
- El cliente puede almacenar la contraseña localmente sin tener que almacenarlo como texto sin formato
- El cliente puede enviar la contraseña sin tener que preocuparse (demasiado) sobre otras partes de la red
- el servidor puede almacenar la contraseña sin tener que preocuparse de que alguien le robe desde el servidor y utilizarlo para conectarse.
Naturalmente, todas las otras cosas (contraseñas fuertes, sal doble, etc.) se aplican también, pero no son realmente relevantes para la pregunta.
La pregunta real es: ¿suena esto como un diseño de seguridad sólido? ¿Pasamos por alto algún defecto al hacer las cosas de esta manera? ¿Hay quizás un patrón de seguridad para algo como esto?
Adición: la razón por la que no queremos almacenar localmente la contraseña en texto plano en el cliente es porque, aunque es triste, muchas personas todavía usan la misma contraseña para múltiples servicios, por lo que obtienen la contraseña 'real' Sería una violación de seguridad más grande para el usuario que obtener su hash robado.
md5() es inseguro. Además, este no es un protocolo seguro. – rook