¿Tengo razón al decir que esto no funcionará si la contraseña no se almacena en texto sin formato en el servidor? No veo cómo el servidor podría verificar el hash si la contraseña ya está hash (con sal y pimienta) en el servidor.
Este esquema requiere que la contraseña se almacene en texto sin cifrar. Muy mal.
¿Se puede extender este esquema para que funcione de alguna manera con contraseñas hash?
Estoy seguro de que puede, pero no es necesario. El esquema al que hace referencia es el protocolo de autenticación de resumen de HTTP . Fue escrito en un día en el que se consideraba costoso implementar SSL en muchos sistemas. Digest authn proporcionó una forma de iniciar sesión a través de canales de texto simple sin exponer la contraseña. Ya no hay razón para hacer eso. SSL ahora es efectivamente libre.
En general, se considera que el riesgo de almacenar las contraseñas en el servidor es mayor que el beneficio de que el servidor no tenga su contraseña en la memoria por un corto período de tiempo (tiempo desde la recepción del mensaje de contraseña hasta que comience el hashing y la memoria de la contraseña de texto se puede borrar).
Hay algunas situaciones donde el hashing del lado del cliente puede tener sentido. Por ejemplo, LastPass implementa un mecanismo de autenticación único que involucra el hashing del cliente y del servidor. Lo hacen porque usan su contraseña como la base para crear su clave de cifrado y nunca quieren que el servidor conozca su clave de cifrado. Entonces, lo que hacen es:
- Muchas rondas de PBKDF2 en el cliente para crear una clave de cifrado segura.
- Una ronda de SHA-256 para convertir la clave de cifrado en lo que efectivamente es su contraseña.
- Enviar contraseña al servidor. Tenga en cuenta que las propiedades de SHA-256 hacen que sea computacionalmente imposible revertir la contraseña a su clave de cifrado.
- El servidor realiza el hashing estándar del lado del servidor utilizando PBKDF2 y salt.
Básicamente, el servidor LastPass realiza el almacenamiento de contraseñas estándar, pero lo que se obtiene como una "contraseña" es el resultado del hashing del lado del cliente.