Supponiamo di voler implementare un sistema OTP che genera numeri da 6 a 10 cifre. (suppone che sia usato per reimpostare la password o inviare denaro)
Gli OTP hanno una scadenza, quindi continuano a essere rimossi dalla memoria del server.
Ho cercato su Internet ma non ho trovato alcun riferimento alle seguenti best practice:
L'utente / utente "malintenzionato" deve fornire l'e-mail insieme a OTP per utilizzarlo.
Il motivo per cui lo chiedo è perché ho un collega che desidera implementare l'OTP come segue:
- Genera OTP, archivia (OTP, email, expireTime, scopo) nella memoria del server. Se lo stesso OTP viene generato di nuovo, la vecchia voce viene rimossa dalla memoria.
- Invia OTP all'email
- Chiedi SOLO input OTP dall'utente (esempio / verifyEmail? OTP = 100434).
- Ottieni (e-mail, scopo) dalla memoria del server per l'OTP
- Utilizza l'OTP allo scopo
Non sono riuscito a convincerlo che questo non è sicuro in quanto un utente malintenzionato può semplicemente generare OTP casuali e chiamare i percorsi e causare automaticamente alcune azioni. ("L'OTP scade tra 3 minuti", "solo una volta ogni tanto sarà un problema", "L'abbiamo usato in un altro progetto e andava bene", ecc.)
Quello di cui ho bisogno è un post o un articolo di un blog (non troppo tecnico) che spiega PERCHÉ questo è insicuro.
Inoltre, quali sono i modi per implementare un buon sistema OTP da 6 a 10 cifre?
La generazione OTP casuale è abbastanza buona?
Il mio suggerimento sarebbe di richiedere solo l'unicità delle coppie (email, OTP) piuttosto che l'unicità di OTP e di richiedere che l'e-mail + OTP sia fornita dall'utente. È sicuro?