Esta construcción "Onion" puede ser peligrosa y solo debe hacerse si tienes suficientes revisores, sin embargo, agrega múltiples propiedades favorables en comparación con el hashing simple:
El primer MD5 sin sal puede ser realizado por clientes o servidores frontend. Normaliza el conjunto de caracteres y la longitud, y confunde las contraseñas desde el principio sin tener que utilizar demasiada CPU.
La sal se lee de la base de datos del usuario, por lo que no está presente en el cliente, esto fue lo que se agregaron los primeros HMAC.
El servicio de cifrado (o mejor HSM) se defiende contra la fuerza bruta (ya que la clave secreta no se conoce). De hecho, esto precede a las recomendaciones del NIST para hacer exactamente esto. Esto no se hace a menudo, ya que requiere una configuración complicada del sistema (HSM o aislamiento del proceso), algo que Facebook puede permitirse.
Dado que el paso de la pimienta puede verse comprometido por personas con información privilegiada, los datos se pasan a scrypt, una función diseñada para hacer que la prueba de contraseñas de fuerza bruta sea más costosa.
El paso final podría no ser necesario, o tal vez se usa para agregar algo de diversificación (SHA2 en lugar de SHA1).
Se parece un poco a la exageración del aceite de serpiente, pero los pasos pueden explicarse de manera razonable. Si lo comparas con el (mucho más débil) glibc-SHA2 Voodoo, está realmente limpio.
BTW1: los autenticadores memorables son generalmente algo malo, tales esquemas solo pueden reducir el riesgo de manejarlos.
BTW2: la debilidad de colisión de SHA1 no se aplica a las construcciones HMAC y el tamaño de hash MD5 corto no duele mucho aquí (ya que las contraseñas casi siempre tienen menos entropía). Sería más riesgoso para una derivación clave, pero esa no es la tarea en cuestión.