Supongo que depende de lo que haga el servidor, pero no agrega mucha protección (o es peor). (Además, ¿el usuario promedio sabe cómo calcular un hash en el móvil? Me suena bastante complicado).
1. El servidor almacena la contraseña hash
Esto significa que el cliente envía H = hash(password)
al servidor, el servidor busca a los clientes con la contraseña hash H'
en la base de datos y valida al cliente marcando H == H'
. Esto es realmente malo. Ahora, si ocurre una violación de la base de datos, el atacante puede ingresar la contraseña con hash que se almacenó en la base de datos para iniciar sesión. Básicamente, elimina el punto de hash en primer lugar y es como si se almacenara la contraseña de texto sin formato.
2. El servidor almacena el hash de la contraseña hash
Esto significa que el cliente envía H = hash(password)
al servidor, el servidor busca el hash de los clientes con la contraseña hash H'
en la base de datos y valida al cliente al verificar H' == hash(H)
. Ahora, si ocurre una brecha en la base de datos, el atacante debe verificar si hash(hash(guess)) == recovered_hash
, por lo que el costo para el atacante es aproximadamente 2 veces lo que sería sin el hashing del lado del cliente (es decir, el atacante puede verificar las contraseñas un 50% más lento, lo que no es mucho una victoria). La seguridad en este caso aún depende de que hash
sea una función (no invertible) resistente a los ataques de diccionario, el hashing del lado del cliente hace poco para ayudar.
Resumiendo, lo mejor que puede hacer es hacer que el cliente ingrese la contraseña en texto simple, transmitir la contraseña al servidor a través de HTTPS y hash la contraseña en el servidor con algo como bcrypt o scrypt, almacenando solo el hash en el servidor. servidor. La razón por la que su construcción no es una mejora es que la "semilla" si no obtiene ninguna entropía y es tan fácil (o no fácil) de adivinar, simplemente está agregando una etapa intermedia.