Dato che sai che i tuoi token in testo semplice sono unici (o almeno questa è un'inferenza logica) non hai bisogno di sale. L'intenzione di Salt è unicamente quella di fornire hash-unicità nel caso di password identiche, ma dal momento che il tuo spazio di input è destinato ad essere garantito univoco, non hai questo problema.
Inoltre, dal momento che hai il controllo sulla casualità e la dimensione dei testi in chiaro, non devi preoccuparti di cracking delle password più deboli con i metodi tradizionali, quindi bcrypt non è realmente necessario per rallentare il processo. Se il tuo spazio di input è ampio e casuale, puoi semplicemente eseguire l'hash con un hash crittografico strong (ad esempio SHA256) senza sale. Ciò ti consente semplicemente di controllare se H(token)
è nel database quando genera un nuovo token (controllo di univocità).
Il processo di convalida di una richiesta di ripristino è quindi piuttosto semplice: prendi l'ID utente e il token in testo normale (come fornito nel link di reset) e verifica che corrispondano nel database calcolando nuovamente H(token)
.
In alternativa, se si desidera ancora utilizzare bcrypt, è possibile garantire l'univocità anteponendo il token casuale all'ID utente prima di inserirlo in bcrypt. Questo non richiede di verificare l'unicità (sarà sempre univoco a causa del prefisso ID) e consente comunque di verificare il token bene.