Attualmente sto scrivendo un'implementazione TOTP in PHP (ma questo vale anche per altre lingue) e, naturalmente, voglio che sia il più sicuro possibile, che cosa dovrebbe essere considerato?
Dopo aver letto la RFC 6238 e RFC 4226 attualmente la mia implementazione è simile a questa:
- Ogni singolo codice utilizzato è in blacklist per 2 minuti, indipendentemente dal fatto che sia stato eseguito correttamente o meno
- Il segreto è generato da un generatore di numeri casuali sicuro
- Il codice QR viene generato sulla mia macchina e non viene consegnato a provider di terze parti
- È necessario entrare in un reCaptcha per prevenire attacchi di forza bruta
- I codici sono convalidati utilizzando una funzione di confronto resistente all'attacco di tempo
- Vengono controllati un totale di 5 codici (l'attuale, gli ultimi due e i successivi due)
- Viene generato un singolo codice di salvataggio di 16 caratteri (da un generatore di numeri casuali sicuro) e visualizzato solo una volta dopo l'attivazione, non può essere recuperato dall'utente in seguito
- Gli utenti vengono richiesti solo una volta ogni sette giorni su una macchina conosciuta (impostando un cookie)
- I codici di Secrets and Rescue sono memorizzati in modo non criptato nel database, ma questo non dovrebbe essere un problema in quanto lo script deve comunque decrittografarlo
Mi mancano alcuni importanti? Alcuni punti sono una pessima decisione?