Se está autenticando a través de la base de datos segura

0

Lo siento por esta pregunta probablemente noobish. Hasta ahora, he leído que la comparación / verificación de contraseñas se entiende implícitamente que se realiza en la capa de aplicación y no en la base de datos. Por ejemplo, en PHP, se haría usando la función password_verify() y no a través de una consulta como

SELECT * WHERE username = foo AND password_hash = $2y$10$blahblah

¿Cuál sería un caso sólido en contra de esto? ¿O es este un enfoque perfectamente válido para la comparación / verificación de contraseñas?

    
pregunta Czar 22.01.2015 - 03:31
fuente

2 respuestas

3

La mejor práctica es utilizar hashes salados para la contraseña. La comparación de dos hashes salados implica eliminar la sal de la contraseña almacenada, agregar la contraseña de texto sin cifrar y repetir y comparar la igualdad. Debido a esto, no es algo que pueda ser fácilmente parte de una declaración WHERE de SQL.

Aunque supongo que esto podría implementarse en la capa DB, la mayoría de las implementaciones recuperarán al usuario por ID y luego compararán los hashes en la capa de la aplicación.

    
respondido por el Steven 22.01.2015 - 04:00
fuente
2

No hay ninguna razón de seguridad por la que no pueda hash la contraseña manualmente y comparar con una declaración SQL. Sin embargo, hay razones no relacionadas con la seguridad para hacerlo.

SELECT hashed_password FROM users WHERE userid=?

La recuperación de la contraseña con hash de la base de datos y la comparación en el código solo requiere un solo acceso a la base de datos.

SELECT salt FROM users WHERE userid=?
SELECT 1 FROM users WHERE userid=? AND hashed_password=?

La comparación en SQL requiere dos accesos: uno para obtener el salt (usted está utilizando sales por usuario, ¿no?) y uno para realizar la comprobación. La penalización de rendimiento adicional puede ser un problema (o no).

    
respondido por el Mark 22.01.2015 - 05:28
fuente

Lea otras preguntas en las etiquetas