Contexto: un sitio web está alojado en varios servidores dedicados. Hay servidores web frontend, servidores de base de datos backend y otros servidores entre ellos. El DB guarda las contraseñas de las cuentas de los usuarios. Todas las conexiones son seguras y las páginas de registro / inicio de sesión no pueden ser forzadas por la ley (fuera del rango de la pregunta).
Modelo de amenaza: un pirata informático logra obtener una copia de la base de datos y quiere descifrar las contraseñas. El pirata informático tiene a su disposición una potencia de hardware muy potente (CPU / GPU / RAM / ASIC) y solo necesita descifrar una sola contraseña para ser considerado el ganador (proteger a un máximo de usuarios no es suficiente, todos los usuarios deben estar protegidos).
Pregunta: ¿Cuál de los siguientes casos se consideraría el más seguro contra los esfuerzos de piratas informáticos?
- hashing basado en iteraciones tradicionales con salt (scrypt / bcrypt)
- Hasheado a mano con múltiples pimientos con secretos muy largos que se guardan en cada "escenario" (servidor web / medio / DB).
- Operación del servidor web: Hash1 = SHA512 (contraseña + secreto1)
- Operación intermedia: Hash2 = SHA512 (hash1 + secret2)
- operación DB: Hash3 = SHA512 (hash2 + secret3)
- almacenamiento DB: Hash3 con sal
Mi opinión es que el caso 2 es, con mucho, el más resistente porque las iteraciones no protegerán las contraseñas pobres (baja entropía) como "123456" durante más de unas pocas horas / días, en el mejor de los casos. Mientras los secretos sean muy largos y al menos uno de ellos permanezca desconocido, creo que la mayor entropía asegurará a todos durante décadas.
No veo que tal esquema sea implementado en la producción muy a menudo, sin embargo, en general, el consenso es "iteraciones + sal o avergonzarse", así que tal vez me esté faltando algo.
Por supuesto, la implementación debería ser segura (hecha a mano frente a más scrypt estándar) y los secretos deben permanecer desconocidos. Además, si se revela un secreto y se debe cambiar, el proceso de actualización sería una molestia. Por otro lado, el proceso de inicio de sesión sería más fácil para el hardware (sin iteraciones).
Editar (según el comentario de Matthews): Mi pregunta no es sobre el beneficio de un pimiento en un método basado en iteraciones. Es la diferencia de seguridad entre las iteraciones basadas en los métodos basados en secretos.
Edit 2: Hice más búsquedas y logré encontrar una pregunta similar después de todo, mi error (quizás los resultados mejoraron según mi actividad en la pregunta actual). Tiene una buena respuesta (por Thomas Pornin) similar a aquí.