Per uno, suppongo che il sistema che state pianificando sia per un caso d'uso limitato, poiché non penso che sia impossibile chiedere un po 'di più alle password in uso generale: anche Stackexchange richiede otto caratteri con numeri.
In un certo senso, un milione di possibili codici è molto piccolo e abbastanza grande. Se un utente malintenzionato ottiene il database delle password e può tentare di rompere gli hash off-line, verranno eliminati in un istante. Anche se l'hashing fosse abbastanza lento da consentire solo il test di dieci codici al secondo, l'intero spazio delle chiavi passerebbe tra un po 'più di un giorno. Non sarà così lento.
D'altra parte, dal momento che è possibile limitare i tentativi di accesso on-line, dovrebbe essere abbastanza controllabile. Per ottenere solo un 1% di indovinare un passcode, l'attacker avrebbe bisogno di 10000 tentativi. Questo non dovrebbe essere normale, specialmente da un IP di origine singola o da un singolo account, e dovresti bloccare l'origine in quel punto e prendere in considerazione la possibilità di bloccare l'account. (Se hai molti utenti e sei attaccato da una botnet, è più difficile da rilevare.)
Anche se con i codici numerici, devi renderli casuali, invece di lasciare che l'utente decida. Altrimenti sceglieranno semplicemente le date, rendendo lo spazio delle chiavi efficace più piccolo. Hai già toccato questo quando pianifichi un reset casuale, ma deve essere casuale per cominciare, altrimenti scoprire i compleanni delle persone sarà troppo redditizio.
Per quanto riguarda la modifica automatica del PIN, diamine no. Oltre allo spam che altri hanno menzionato, potrebbe anche bloccare l'utente legittimo se non è in grado di accedere alla loro e-mail solo al momento giusto. E se fai no limitando il tasso, non avranno il tempo di leggere la loro e-mail prima che l'hacker abbia sfornato altri 20 tentativi, e il codice cambia di nuovo ... Poi di nuovo, se do che limita il tasso, puoi semplicemente bloccare l'account di proposito per un po '.
Ovviamente, il blocco degli account è un vettore DoS, ma è un compromesso che devi scegliere. Vuoi dare la priorità ai furti con i cattivi o assicurarti che i bravi ragazzi entrino?
Il cambio automatico renderebbe il codice più difficile da indovinare? Bene, sì, marginalmente. Per un passcode invariato, avresti K in N possibilità di indovinarlo, quando fai K indovina contro N possibili codici. Per un codice che cambia, la possibilità di indovinarlo è una costante 1 / N per ogni ipotesi, o 1- (1-1 / N) ^ K per le ipotesi di K. Funziona a circa 500000 vs 700000 per una probabilità del 50% di farlo bene. È più, ma nella stessa scala. Vuoi consentire quei centomila tentativi di accesso in primo luogo?