2009-05-06 24 views
6

Sto creando uno script che accetta un elenco di nomi e indirizzi e-mail e invia un'email inviandoli a registrarsi per il sito Web sicuro del nostro dipartimento. L'elenco di nomi ed e-mail è disponibile su una pagina pubblica di fronte allo stesso sito. Ho bisogno di un modo per dare loro un token unico che li identificherà quando seguono un link nell'e-mail alla pagina per registrare l'account. L'utente utilizzerà il token una sola volta, per creare l'account e impostare la password iniziale.Strategie per l'autenticazione degli utenti una volta senza identificatore precondiviso

Quale sarebbe il metodo migliore per generare il token? Una stringa casuale memorizzata in un database? Un hash generato dalle informazioni dell'utente e un po 'di sale? Qualcos'altro? Capisco che la sicurezza di questo metodo dipende dalla privacy del singolo invito via e-mail, il che è un po 'comprensibile.

+1

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. –

risposta

3

Perché deve essere un hash in particolare? Basta inserire il nome utente del nuovo utente come parte del collegamento e generare in modo casuale un token di autenticazione di qualsiasi durata e archiviarlo nel database, collegato al proprio nome utente, fino a quando non si autenticano.

Così il link che ottengono nella e-mail è qualcosa di simile:

http://domain.com/confirm.php?user=Chad&t=AB14CD05 

E 'davvero non importa se ci sono collisioni, si tratta di un evento di rischio piuttosto basso in ogni caso. Che cosa potrebbe andare storto in ogni caso, qualcun altro potrebbe ... confermare il loro indirizzo email per loro? Di cosa sei preoccupato? Forse se spiegassi l'intero processo in modo un po 'più dettagliato, capirei meglio le tue esigenze.

+0

Penso di aver bisogno di cambiare la domanda. Vostro diritto, non dovrei trovare il modo migliore per creare un hash per soddisfare le mie esigenze, ma dovrei chiedere quale sarebbe la soluzione per il problema generale di autenticazione quando l'unico identificatore semi-privato è il token che invio nell'invito e-mail. Dovrei modificare la mia domanda o dovrei postarne una nuova? –

9

Esistono molti algoritmi di hash. Puoi guardare questo link per vedere se uno funzionerà meglio per te, dal momento che non hai bisogno di un hash sicuro. Puoi anche vedere come SSL lib genererà un hash md4 di 8 caratteri.

http://www.partow.net/programming/hashfunctions/#top

1

Partenza gperf.

GNU gperf è una perfetta funzione di hash generatore. Per un determinato elenco di stringhe , produce una funzione di hash e una tabella hash, in forma di codice C o C++ , per cercare un valore che dipende da sulla stringa di input. La funzione di hash è perfetta, il che significa che la tabella hash non ha collisioni e la ricerca tabella hash richiede solo un confronto di stringa .

E anche CMPH - C Minimal Perfect Hashing Library

ci sono diverse legate SO domande:

+0

Grazie per le risposte, sembra che stavo facendo la domanda sbagliata. –

+0

Chi ha appena fatto un downvote, grazie per la "vendetta" a favore di downvote –

2

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.

+0

Ottimo punto per quanto riguarda gli hashing possibile a "reverse engineer". E se sei davvero preoccupato per le persone che indovinano i numeri casuali, aggiungi un po 'di protezione che cancelli il loro account se provano ad autenticare con il token sbagliato 10 volte, o qualcosa del genere. Quindi è praticamente impossibile imitare qualcuno. –

+0

Se hai davvero bisogno di usare un hash basato su "valori noti", puoi salare l'hash, il che rende estremamente difficile da indovinare. Per esempio. sha1 ("6b34ff3b93d0ebd46d3e". $ username. "8ca97cf1ae342d340f26"). Certo, se il sale è trapelato, allora tu sei pulito. Ma sì, è meglio generare un valore casuale non correlato alle informazioni utente e archiviare quel valore casuale in un database. – dirtside

Problemi correlati