Primero, sin importar dónde los guarde, debe asegurarse de que hash correctamente ellos . Esa es la prioridad número uno. Y tenga en cuenta que es hash , no encrypt . Sí, hay una diferencia. Una gran diferencia.
En cuanto a dónde almacenarlos, la opción tradicional obvia sería una base de datos. Comparemos las contraseñas de almacenamiento en una base de datos para almacenarlas en un archivo. Ambas opciones vienen con su propio conjunto de errores fáciles que pueden exponer datos.
Para las bases de datos, debe asegurarse de protegerse contra la inyección de SQL y fortalecer el servidor de la base de datos (no lo exponga a Internet, use credenciales sólidas, etc.).
Para sistemas basados en archivos, hay un grupo separado de problemas:
- Coloque el archivo fuera de webroot.
- Debe asegurarse de que no haya vulnerabilidades de inclusión de archivos locales en su servidor.
- Asegúrese de que el archivo no termine en copias de seguridad, repositorios de git, etc.
Yo diría que es mucho más fácil hacerlo bien con una base de datos, ya que tiene una separación más clara entre el código y los datos. Pero lo que importa al final aquí es la implementación. Una biblioteca de base de datos homebrew mal escrita con SQLi es peor que un marco bien establecido y probado para archivos.
Sin embargo, espero que sea más difícil hacerlo bien con los archivos que con una base de datos. Y para ser honesto, comenzar con un sistema de inicio de sesión correcto en PHP es extremadamente difícil . Perdona mi pesimismo, pero la mayoría de las personas que se proponen hacer esto fracasan y terminan con sistemas inseguros. Tal vez debería mirar en los marcos existentes? Eso reduciría enormemente su riesgo.
(Obviamente, las bases de datos tienen algunas ventajas técnicas bastante grandes que no están relacionadas con la seguridad, pero las estoy dejando fuera de la discusión aquí).