Il problema principale con l'utilizzo della sola password è che non puoi applicare sali .
In un normale server robusto che autentica gli utenti tramite password, le password non vengono memorizzate "come sono" ma hash . Il processo di hashing della password richiede un po 'di attenzione, perché un utente malintenzionato che ottiene una copia di quel file con password hash (ad esempio attraverso un attacco SQL injection) può eseguire un attacco dizionario : questo è" provare "potenziali password. Gli utenti umani tendono a scegliere password che sono "parole" in una lingua, o derivate semplici da quella (ad esempio aggiungendo una cifra), da cui il termine "dizionario".
Per rendere l'operazione più difficile per l'utente malintenzionato, il processo di hashing della password deve:
- essere intrinsecamente lento imponendo, ad esempio, un milione di invocazioni di funzioni hash annidate;
- essere salted : il sale è un parametro che altera il modo in cui funziona l'hashing e ogni password hash ha il proprio valore salt. In questo modo, quando l'utente malintenzionato tenta una potenziale password, deve prima scegliere quale password hash avrà come target.
Il nome utente è il selettore di sale: quando il server riceve il nome utente, lo cerca nel suo database, ottenendo la password hash e il valore salt che è stato usato per calcolare quell'hash ( entrambi sono memorizzati insieme). Ciò consente al server di ricalcolare l'hash, iniziando con quel valore salt e la password che l'utente ha fornito. Se il server ottiene lo stesso valore di hash di quello che è stato memorizzato, l'utente viene autenticato; in caso contrario, l'utente viene rifiutato. Buoni algoritmi per questo sono bcrypt e PBKDF2 . Preferisco bcrypt ( ma PBKDF2 non è male).
Senza nome utente, senza sale. Il server non può sapere quale valore di sale usare per la password specifica, quindi deve utilizzare lo stesso sale (cioè senza sale) per tutte le password memorizzate. Ciò consente agli aggressori di attaccare tutte le password contemporaneamente, il che è molto più efficiente.
È più semplice vederlo se pensi a un attacco di dizionario online , in cui l'utente malintenzionato cerca potenziali password sul tuo server. Con un nome utente + una password, l'utente malintenzionato deve inviare un nome utente e una password e ha successo se l'utente con quel nome ha effettivamente tale password . Senza il nome utente, l'autore dell'attacco invia semplicemente una potenziale password e riesce se qualsiasi utente sul sistema ha quella password. Se hai 1000 utenti, hai appena reso l'attacco 1000 volte più facile.
Inoltre, quando un nuovo utente si registra, sceglie la sua password. Se tale password si scontra con quella di un altro utente, non hai altra scelta che rifiutare la registrazione. A quel punto, il nuovo utente ha appena saputo che la password che voleva usare è già una password valida per un altro utente - hai appena trasformato il nuovo utente in un attaccante di successo, e lo sa ... .
Va bene, devo ricordare non per rispondere alla domanda dopo aver mangiato, ma prima del caffè. Ho appena notato che le tue "password" sono in realtà UUID con 122 bit di entropia generata casualmente. In tal caso, le cose andranno meglio. Non chiameremmo queste "password" UUID, dal momento che non sono "parole" e non sono scelte da un essere umano, né nemmeno ricordate da un essere umano. Questi sono token di autenticazione .
Continuerete a fare le vostre transazioni su SSL. Inoltre, poiché i clienti non li ricordano , li scriveranno, in file o su carta (più probabilmente file, in modo che possano tagliarli e incollarli - nessuno vuole digitare l'intero UUID su una base regolare). Ciò rende più difficile mantenere la segretezza di questi UUID. I tuoi clienti dovranno assumersi la responsabilità di mantenere segreti questi valori; questo potrebbe essere un po 'troppo chiedere a un cliente tipico.