:: On Fri, 12 May 2023 18:42:59 -0000 (UTC)
:: (it.comp.sicurezza.varie)
:: <u3m1bj$1onud$
1...@dont-email.me>
:: rootkit <
roo...@email.it> wrote:
> poco tempo fa utenti segnalavano chiari indizi che si salvavano le
> password in chiaro (banalmente consentiva agli utenti di recuperarla).
Beh, potevano anche salvarle criptate, ma il punto è che le password
NON vanno criptate e NON vanno salvate, quello che il server deve
memorizzare non è la password ma il salted hash (ed il salt) della
stessa ed il salt deve essere toralmente random e diverso per ciascun
account
In pratica, alla creazione dell'account vengono immessi in un form
(protetto tramite SSL/TLS) le credenziali, ossia utente e password,
quando l'utente conferma il server genera un valore "salt" totalmente
casuale e di congrua lunghezza, lo accoda alla password e quindi
calcola un hash (es. SHA-2) e tale hash viene quindi memorizzato
insieme al nome utente ed al salt
Al successivo logon (sempre protetto da SSL/TLS, mai in chiaro) il
server riceve utente e password, a questo punto, cerca l'utente e
recupera il "salt" memorizzato, lo accoda alla password immessa e
calcola l'hash risultante, poi confronta tale hash con quello che era
stato memorizzato in precedenza e, se i due corrispondono, consente
l'accesso
nel caso in cui il database delle credenziali venga "rubato" l'hash non
permetterà un recupero diretto delle password (dato che non si tratta
di un sistema crittografico reversibile) e l'uso del "salt" aumenterà
in maniera esponenziale i tempi necessari per tentare di "craccare" una
password, fosse pure usando "rainbow tables" o simili
Provo a fare un esempio, diciamo che il nostro account ha come utente
"pippo" e come password "F3rr4ri.2023", alla creazione dell'account il
server genera un "salt" casuale, diciamo che sia
"DH!6K@T`'/!AkN6A?#vBX$L:?Wz*e8FA"
quindi aggiunge il salt alla password, ottenendo qualcosa di questo tipo
"F3rr4ri.2023::DH!6K@T`'/!AkN6A?#vBX$L:?Wz*e8FA"
il "::" è solo una mia aggiunta, può essere omesso o si possono
utilizzare altri caratteri, non è un problema, fatto questo, il server
va a calcolare l'hash della stringa di cui sopra, supponendo di usare
SHA-256 il risultato sarà
"544016e3ac0d6815b0c75478bf64c4dbcb5d8a648d7a82419dbd3fe820f4e7cf"
a questo punto, il server salva nel DB delle credenziali le seguenti
informazioni (e magari anche altre)
utente=pippo
passwd=544016e3ac0d6815b0c75478bf64c4dbcb5d8a648d7a82419dbd3fe820f4e7cf
salt=DH!6K@T`'/!AkN6A?#vBX$L:?Wz*e8FA
al successivo logon l'utente immette nome e password (su canale
protetto da SSL/TLS), il server va a cercare l'utente ("pippo" nel
nostro esempio) nel database e, se lo trova, recupera il "salt" e, con
quello ricalcola l'hash della password immessa, se questo corrisponde
all'hash memorizzato, viene permesso l'accesso
Da notare che un livello aggiuntivo di sicurezza è quello di usare per
la validazione un server separato e NON esposto su internet, in tal
caso la registrazione utente vista sopra e la validazione credenziali
verranno effettuate dal server di frontend (esposto su internet)
tramite chiamate a WEB services ed il DB non verrà MAI esposto dal
frontend che NON avrà alcun accesso allo stesso, se non tramite le
chiamate ai necessari WEB services