La tua domanda sembra riguardare entrambi, cosa fa Facebook e cosa potrebbe essere fatto. Non so cosa faccia l'FB, ma posso provare a fare delle buone ipotesi su ciò che rende un sistema sicuro. Spero che questo aiuti.
Fammi provare a riformulare ciò che Facebook sta facendo. I siti in genere supportano un singolo fattore di autenticazione , qualcosa che conosci (ovvero: la tua password ). I siti che supportano la funzionalità "ricordami", usano il fattore qualcosa che hai (il "qualcosa" è il cookie nel tuo browser). Questo può essere più debole dato che chiunque abbia accesso al tuo browser, anche a un utente malintenzionato remoto, può ora accedere come te. Ma non dover digitare la password ogni volta che accedi a un sito, soprattutto se hai una password complessa, è una seccatura. Quindi Facebook sta scegliendo una via di mezzo, fondamentalmente con una funzione "ricordami di due fattori" in cui ti serve il nonce ( qualcosa che hai ) e il tuo PIN ( qualcosa che conosci ).
- What might the server be storing? A hash of the nonce + PIN?
È molto probabile che Facebook stia memorizzando un hash del nonce + PIN. Nota che questo potrebbe essere un hash semplice e sicuro invece di qualcosa come la più complessa funzione di memorizzazione della password di bcrypt. Un hash come SHA512 è irreversibile quando viene utilizzato su stringhe di dati casuali di grandi dimensioni e crittograficamente. Il nonce è (presumibilmente) un numero casuale.
- How might the server be validating PIN login attempts?
Il server semplicemente ripristina l'hash e lo confronta con il campo appropriato nel database.
- Are there any reference implementations for a system like this that I could look at?
Non che io sappia, forse altri possono aiutarti.
- Assuming that the content stored in the browser is not taken by an attacker, is it possible for this system to be at least as secure as traditional username/password authentication? If not, what kind of attack would it be more vulnerable to?
Se rendiamo quell'assunzione veramente grande e infondata , questo sistema è più sicuro del normale uname / pwd in quanto ciò ha l'effetto di rendere la password la concatenazione di un numero casuale crittograficamente sicuro, il nonce e il PIN. Le password di numeri casuali crittograficamente sicure sono molto forti.
Ma, nel mondo reale, i dati del browser non possono mai essere considerati sicuri, quindi la sicurezza di questo meccanismo si riduce alla sicurezza del PIN e del nonce. È difficile da concretizzare. Questo è sicuramente più sicuro della semplice funzionalità "ricordami". Se i dati del tuo browser sono ragionevolmente sicuri, questo potrebbe essere più sicuro delle password standard. In caso contrario, le password standard potrebbero essere più sicure. In quasi tutte le situazioni, questo batte le password deboli a causa del fattore qualcosa che hai .
Alcuni punti di nota:
- Il server deve eseguire l'hash. Se il client dovesse eseguire l'hash, una tabella di database rubata potrebbe essere utilizzata come credenziali di accesso. Questo non può accadere con il server che esegue l'hash perché l'hash è irreversibile.
- È possibile aggiungere ulteriore sicurezza utilizzando una funzione di memorizzazione della password come bcrypt anziché un hash standard. Questo è necessario solo se usi un nonce più breve. Gli attacchi più lunghi forniranno una protezione sufficiente contro un attacco di forza bruta, anche con un semplice SHA512 (o simile) in uso.
- Penso che abbia senso registrare i tentativi falliti di login con il PIN e, dopo aver detto 3 tentativi falliti, cancellare il login del PIN dal database e forzare l'utente ad accedere con la propria password. Ciò fornisce molta protezione contro la ricerca di un dizionario per il PIN, anche a fronte di un nonce trapelato, in quanto il PIN sarà reso inutilizzabile. Anche se l'utente riutilizza lo stesso numero di un nuovo PIN al successivo accesso, riceverà un nuovo nonce che un utente malintenzionato dovrà rubare per provare più possibilità PIN.