Perché non solo assegna un numero a 64 bit casuale trasmettere con id dell'utente. Prendi il numero a 64 bit, spezzalo in blocchi di 5 bit e usa ciascun blocco di 5 bit per indicizzare un alfabeto di 32 caratteri: 23456789ABCDEFGHJKLMNPQRSTUVWXYZ (omettendo convenientemente 01IO). Con un numero a 64 bit e un codice a 5 bit/(tranne l'ultimo) si ottiene uno slug di 13 caratteri da utilizzare per identificare l'utente. Potresti applicarlo con 2 caratteri casuali per dare 3 gruppi di 5 caratteri, se lo desideri.
Effettuare l'id e la parte di slug dell'URL di accesso. Controlla il valore dello slug memorizzato con l'id nel database per assicurarti che siano uguali. Penso che per la maggior parte degli scopi questo sarebbe un valore abbastanza grande da rendere estremamente difficile da indovinare - il numero è casuale dopo tutto - quale slug va con quale id utente.Utilizzando un generatore di numeri casuali crittograficamente forte, penserei che sarebbe altamente improbabile che tu possa ottenere numeri di ripetizione per qualsiasi tuo utente.
potrebbe assomigliare:
http://example.com/activate?userid=bgates&validate=GY45M-RHQBN-32GYM
Utilizzando un hash di valori noti in realtà potrebbe rendere più facile per qualcuno di indovinare il codice corretto rispetto all'utilizzo di un numero casuale. Usando un hash si deve solo indovinare quali bit si stanno utilizzando ed eseguirli attraverso vari algoritmi di hash. Se qualcuno è in grado di riunirli insieme, per esempio dato un paio di esempi e abbastanza tempo per provare varie combinazioni, allora tutto ciò che devono fare per decifrare il codice di qualcuno è determinare gli attributi (probabilmente) comunemente noti per una data persona e usare quelli per impersonare loro e creare un account. Con un forte numero casuale assegnato a ciascun individuo viene lasciato solo un attacco di forza bruta.
Il tuo problema aggiornato non è in realtà diverso, concettualmente. Tutto quello che devi fare è usare l'indirizzo email al posto del "nome utente" a cui ho fatto riferimento nella mia risposta. Generare in modo casuale un token, memorizzarlo da qualche parte collegato all'indirizzo e-mail e fare in modo che il link nell'e-mail contenga sia la propria e-mail sia il token in modo da poter effettuare la ricerca. –