Questo costrutto "Onion" può essere pericoloso e dovrebbe essere fatto solo se hai abbastanza revisori, tuttavia aggiunge più proprietà favorevoli rispetto all'hash semplice:
Il primo MD5 non salato può essere eseguito da client o server di frontend. Normalizza charset e lunghezza e nasconde le password nella fase iniziale senza richiedere troppo tempo per la CPU.
Il sale viene letto dal database dell'utente in modo che non sia presente sul client, questo è stato il primo HMAC aggiunto.
Il servizio di crittografia (o HSM migliore) difende dalla forza bruta (poiché la chiave segreta non è nota). In realtà questo precede i consigli del NIST per fare esattamente questo. Questo peppering non viene spesso eseguito in quanto richiede complicate impostazioni di sistema (HSM o isolamento del processo) - qualcosa che Facebook può permettersi.
Dato che il passaggio del pepe potrebbe essere compromesso dagli addetti ai lavori, i dati vengono quindi passati a scrypt, una funzione progettata per rendere più costoso il test di forza bruta delle password.
Il passaggio finale potrebbe non essere necessario, o forse è usato per aggiungere qualche diversificazione (SHA2 invece di SHA1).
Sembra un po 'eccessivo l'olio di serpente, ma i passaggi possono essere ragionevolmente spiegati. Se lo paragoni con il (molto più debole) glibc-SHA2 Voodoo è veramente pulito.
BTW1: gli Authenticator memorabili sono generalmente una brutta cosa, tali schemi possono solo ridurre il rischio di gestirli.
BTW2: la debolezza di collisione di SHA1 non si applica ai costrutti HMAC e la dimensione dell'hash MD5 breve non danneggia molto qui (dato che le password hanno quasi sempre meno entropia). Sarebbe più rischioso per la derivazione delle chiavi, ma non è questo il compito a portata di mano.