Configuración
Un servidor que ejecuta una base de datos PostgreSQL y un Apache con varias aplicaciones php. El acceso a db es a través de la interfaz de bucle invertido. La base de datos contiene una tabla con el nombre de usuario y el hash de contraseña SHA-512-CRYPT ( $6$salt$hash
).
Solución común
Las aplicaciones leen la contraseña del usuario, la modifican y hacen una comparación de cadenas en la base de datos. Si las cadenas coinciden, el usuario se autentica.
Mi solución
La base de datos tiene una función almacenada (¿o una declaración preparada?) check_password(user, password)
que las aplicaciones php consultan con SQL. Así que envían el usuario y la contraseña en claro e interpretan la respuesta de la db (por ejemplo, filas devueltas). Esto tiene la ventaja de que no tengo que asegurarme de que todas las aplicaciones admiten el mismo algoritmo hash seguro y puedo encapsular la autenticación en un solo lugar en la base de datos. Se podría hacer lo mismo para los cambios de contraseña update_password(user, old_password, new_password)
.
¿Hay algún inconveniente con esta solución?
EDITAR: Se agregó una aclaración sobre el formato de contraseña almacenada.