tl; dr: Me pregunto cuál es la mejor manera de verificar una contraseña cuando el cliente no confía en el servidor.
Sé de dos maneras comunes en que los servidores pueden verificar si la contraseña de un usuario es correcta:
- El servidor almacena el hash de la contraseña, el cliente envía la contraseña y el servidor hace un hash de la contraseña y compara el hash con el hash almacenado. Si coinciden, la contraseña es correcta.
- El servidor almacena la contraseña en texto sin formato y genera un salt que combina con la contraseña y los hashes, y luego envía el salt al cliente. El cliente hash la contraseña y el salt, y envía ese hash de vuelta. El servidor compara los dos hashes y, si coinciden, la contraseña es correcta.
Sin embargo, ambos métodos requieren que el cliente confíe en el servidor, y el primero requiere que la conexión sea segura (mientras que el segundo obviamente no lo hace).
He pensado en una forma, pero no sé si es buena porque no tengo experiencia en criptografía, no sé qué contorsiones pueden comprometer la seguridad.
El método es que cuando el cliente crea una cuenta, el cliente genera un par de claves RSA a partir de su contraseña al colocar el generador de números aleatorios con el hash de la contraseña y enviar la clave pública al servidor. Más tarde, cuando el servidor quiera verificar si un usuario tiene la contraseña correcta, puede generar algunos datos y enviarlos al cliente para que los firme. El cliente responde con la firma y el servidor puede verificar la firma, y si es válida, el cliente tenía la contraseña correcta.
De esta manera, el servidor nunca llega a ver la contraseña del cliente.
Esta podría ser una forma estúpida de hacerlo. Sin embargo, me gustaría saber cuál es la forma común de hacer esto, y si no hay una común, lo que los expertos en seguridad aquí piensan de la forma en que lo describí. Como dije, solo conozco de criptografía lo que he aprendido para el desarrollo web, que es ridículo, por lo que podría haber pasado por alto algo obvio.
Información adicional
Sé que solo puede generar un par de claves RSA y almacenar un archivo que contenga la clave en su computadora, como lo que puede hacer para los inicios de sesión de SSH, sin embargo, debe guardar su clave en algún lugar, y si la computadora está incautado entonces su contraseña está comprometida. El método que busco debería requerir solo una contraseña además del nombre de usuario.