È un tema comune. Lo scenario n. 1 è un ottimizzazione dello storage rispetto allo scenario n. 2. In # 2, devi generare e memorizzare un lato del server con valore casuale. Questo ti dà tutto il controllo che desideri, ma richiede una colonna aggiuntiva nel tuo database, o qualcosa del genere. Lo scenario scarica questo requisito di archiviazione lato client. Poiché il client non può essere considerato attendibile, è necessario aggiungere al link un controllo di integrità, ad esempio un MAC ; la crittografia non è necessaria perché non c'è nulla nel link di reset che è necessario mantenere segreta dall'utente (l'utente conosce già il suo nome e quando ha chiesto la reimpostazione della password), ma si desidera impedire a un client malintenzionato di creare un falso ripristina il collegamento, quindi il MAC.
I contenuti del token, nello scenario # 1, devono quindi includere tutti i dati necessari per applicare il criterio di reimpostazione della password, ma hanno scelto di non archiviarli sul server; questo significa il nome utente e una data / ora (tempo in cui è stato avviato il processo di reimpostazione della password o tempo di scadenza). Si potrebbe voler includere un hash della password precedente nell'input al MAC (non necessariamente nel token) se si desidera impedire all'utente di riutilizzare il link di ripristino più volte.
L'elaborazione e la verifica di un MAC non richiede molte risorse, probabilmente un po 'meno che generare un token casuale e archiviarlo in un database (l'accesso al database sarà molto più costoso della crittografia). Tuttavia, è probabile che questo effetto sia comunque trascurabile (i database sono veloci). Uno svantaggio dello scenario n. 1 è che è necessario mantenere una chiave segreta sul server, condivisa tra i front-end (se ne hai diversi), resiliente al riavvio (quindi non una chiave solo nella RAM, a meno che tu non sia pronto a invalidare tutti i link per reimpostare la password quando il server si riavvia), e, ovviamente, al riparo dagli intercettatori.
Il token casuale (scenario # 2) è probabilmente più semplice, oppure, se preferisci, più difficile da sbagliare . Quale è una buona ragione per raccomandarlo.