Gestire password utenti registrati. Quale codifica?

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Buonasera, Ho letto a giro che sia l'algoritmo md5 che sha1 non vanno bene per salvare le password. Io fino a ora ho utilizzato md5 e attraverso uno script criptavo la password prima che venisse inviata via post nella pagina di verifica dei dati per vedere se questo utente esiste o no.
La mia domanda è:

è rischioso inviare la password in chiaro dalla pagina di login a quella di verifica e poi utilizzare la funzione crypt() ?

Voi come fate?

Grazie a tutti
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Ciao lorenzo,
generalmente si usa SSL per risolvere il problema dello sniffing delle password attraverso un network.

Per applicazioni meno sensibili può essere però un alternativa considerare l'utilizzo delle librerie jsSHA che ti permettono di usare sha256 (o, anche meglio, sha512) come algoritmo di hashing lato client e spedire quindi la password criptata attraverso il network fino alla rete di destinazione.

Il sistema però deve essere integrato con un salt dinamico e fortemente randomico che dovresti salvare in sessione e cambiare ad ogni tentativo di login, altrimenti l'utilizzo della crittazione lato client è perfettamente inutile.

Per generare un valore fortemente randomico (quindi crittograficamente sicuro) puoi usare la api mcrypt_create_iv impostando una dimensione al valore di entropia e il tipo di generatore (ti consiglio personalmente MCRYPT_DEV_URANDOM).
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Per realizzare una connessione sicura (la famosa https che vedi aprendo la homepage di google, per esempio) hai bisogno di acquistare un certificato SSL presso un ente certificatore e poi installarlo sul server.

Generalmente ti devi rivolgere presso il tuo servizio di hosting che avrà quasi sicuramente dei piani dedicati per forniti il servizio e semplificarti il passaggio iniziale.
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Io utilizzo anche un sistema per cui se vengono effettuati 5 tentativi consecutivi con una password sbagliata viene bloccato l'account e viene automaticamente inviata una mail all'utente per la riabilitazione... Potrebbe essere sicuro?
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Temo tu non abbia molto chiare le varie fasi che intercorrono in un sistema di login classico, provo a spiegarti.
La password di un utente, in ordine, segue questo percorso:

1. L'utente immette la password nel modulo e lo invia
2. La password viaggia dal PC dell'utente al Server attraversando prima la rete locale e poi internet.
3. Il server riceve la password e la verifica con lo username fornito sempre dall'utente.

Durante la fase #2 succede che la tua password viaggia in chiaro nella rete e, soprattutto se ti colleghi ad internet da reti pubbliche o non fidate, c'è la possibilità che un attaccante possa intercettare il dato.
Una connessione sicura con SSL permette di far si che la password viaggi criptata durante il suo percorso nella rete fino al server, in questo modo se un attaccante riesce a intercettarla non sarà ingrado di decodificarla.

A questo punto, la questione di limitare i tentativi di login o l'algoritmo di hashing con cui codifichi la password da salvare sul database sono contromisure che si affrontano per altre tipologie di attacco che avvengono in altri modi diversi.


Il tuo quesito a questo punto cosa riguarda nello specifico ? La possibilità che la tua password possa essere intercettata lungo il network oppure vuoi sapere un modo sicuro per conservarla nel database ?
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Grazie per la pazienza!!! :D
I miei quesiti sono appunto il punto 2 e come conservarla nel db. Io dal form attuale la invio in md5 o sha1 e nel db la salvo nello stesso modo...
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Per il punto due allora puoi risolvere come ti ho già suggerito nella prima risposta (SSL oppure il metodo con jsSHA).
Per quanto riguarda l'archiviazione della password, suggerisco di usare la funzione crypt nel seguente modo:

PHP:
#> Password da archiviare nel db fornita dall'utente all'atto dell'iscrizione o del modifica password 
$password = 'Password utente';

#> Generiamo un salt casuale crittograficamente sicuro
$salt = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM);

#> Rendiamo il salt compatibile con la sintassi dell'hash che stiamo per usare
$salt = '$2a$10$' . strtr(base64_encode($salt), '+', '.');

#> Codifichiamo la password
$hash = crypt($password, $salt);

#> A questo punto è $hash che devo salvare nel database

Il tuo sistema di login farà il controllo invece in questo modo:
PHP:
$hash = 'Hash della password utente recuperato dal database';
$password = 'Password utente fornita dal modulo login';

if (crypt($password, $hash) === $hash) {
    #> La password immessa è corretta!
} else {
    #> Password Errata..
}

Questo è attualmente il miglior modo di archiviare una password nel database, tant'è che dalla versione 5.5 di PHP è stata introdotta una funzione per semplificare ulteriormente i passaggi che ti ho mostrato: password_hash().
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
quindi quello che mi hai postato te funziona con versioni inferiori a 5.5 giusto? domani provo... Ma allora fammi capire ha senso o non ha senso bloccare l'account dopo 5 tentativi?
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
bene via almeno una l'ho fatta giusta!!! L'ultima domanda: cosa cambia se utilizzo ssl a livello di codice?
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Assolutamente nulla, usando ssl tutto il lavoro di criptaggio e decrittazione dei dati è completamente automatizzato.
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
mi sorge un dubbio... la password però può essere intercettata dal form di login alla pagina di verifica no?
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Yep, ma se usi SSL chi cerca di intercettare la password può catturare solo una serie di dati incomprensibili.
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Per il punto due allora puoi risolvere come ti ho già suggerito nella prima risposta (SSL oppure il metodo con jsSHA).
Per quanto riguarda l'archiviazione della password, suggerisco di usare la funzione crypt nel seguente modo:

PHP:
#> Password da archiviare nel db fornita dall'utente all'atto dell'iscrizione o del modifica password 
$password = 'Password utente';

#> Generiamo un salt casuale crittograficamente sicuro
$salt = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM);

#> Rendiamo il salt compatibile con la sintassi dell'hash che stiamo per usare
$salt = '$2a$10$' . strtr(base64_encode($salt), '+', '.');

#> Codifichiamo la password
$hash = crypt($password, $salt);

#> A questo punto è $hash che devo salvare nel database

Il tuo sistema di login farà il controllo invece in questo modo:
PHP:
$hash = 'Hash della password utente recuperato dal database';
$password = 'Password utente fornita dal modulo login';

if (crypt($password, $hash) === $hash) {
    #> La password immessa è corretta!
} else {
    #> Password Errata..
}

Questo è attualmente il miglior modo di archiviare una password nel database, tant'è che dalla versione 5.5 di PHP è stata introdotta una funzione per semplificare ulteriormente i passaggi che ti ho mostrato: password_hash().

Ciao!!! ho implementato nella creazione di un nuovo utente questo meccanismo per la password e funziona. Adesso il dubbio è come faccio a criptare la password con javascript? in che codifica ? Ho guardato jsSHA ma non ho capito come fare...

Mi aiuti?
grazie mille
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Scusami mi devo rettificare: usando il crypt per generare gli hash non è possibile utilizzare quella soluzione alternativa con le jsSha senza introdurre un buco nella logica di sicurezza. Puoi ricorrere solo ad SSL :S
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
Ma se venisse intercettata la password non avrebbero accesso perché il Salt lo conosco io sbaglio?
 

flameseeker

Utente Attivo
27 Nov 2013
699
0
0
Il problema sta nella comparazione del dato.
Una volta che fai l'hash lato client col salt, ottieni un hash sha512 che non puoi replicare per una comparazione lato server.

Qualsiasi altro metodo (senza usare un hash simile lato server per memorizzare la password) introduce dei buchi nella meccanica di sicurezza che rendono inutile il workaround.

Nella situazione attuale puoi affidarti solo ad SSL per essere tranquillo anche perché non ti consiglierei di indebolire il metodo di hashing della password per usare le jsSha.
 

lorenzo84

Utente Attivo
22 Lug 2012
239
0
16
E se non ho ssl mi conviene usare md5 criptando la password lato client o rischiare lasciando la password in chiaro e comparandola lato server come nel tuo esempio?
 
Discussioni simili
Autore Titolo Forum Risposte Data
E Come gestire al meglio le immagini legno grande formato Photoshop 0
L Interfaccia grafica per gestire sql server .NET Framework 1
R Plugin per Gestire videocorsi a pagamento WordPress 3
M Come gestire aggiornamenti e modifiche di sito live CMS (Content Management System) 0
S Gestire scelta dropdown con dati da Mysql PHP 2
Tommy03 Gestire dimensioni immagini PHP 4
D Come gestire un singolo checkbox PHP 10
MarcoGrazia Gestire lista campi vuoti in fase di autenticazione jQuery 1
elpirata Gestire permessi accesso alle pagine PHP 3
A [ASP.Net] Gestire il profilo ADMIN in un progetto ASP NET e pattern MVC ASP.NET 0
M [PHP] Come gestire gli utenti online PHP 9
M [php] Come gestire i tags PHP 1
svtmaster professionalità per gestire sito web Offerte e Richieste di Lavoro e/o Collaborazione 4
L [HTML] Gestire movimento GIF HTML e CSS 0
BestSellerMauroTop Software per gestire tanti profili e pagine, e farle crescere in modo autonomo! Annunci servizi di Social Media Marketing 0
W Gestire ccTalk o libreria c++ da php PHP 0
W [PHP] gestire una richiesta curl sul server PHP 0
W Piccolo sistema per gestire alcune periferiche, Java o altro linguaggio? Java 8
bubino8 [WordPress] Gestire SSL (https://) da .htaccess WordPress 9
C [WordPress] Creare e gestire un nuovo sito web WordPress 5
M Gestire ErrorDocument 404 mantenendo lo stesso url Web Server 0
S gestire una tabella mysql PHP 9
R gestire il ritorno di una variabile con success Ajax 2
S Gestire Motion Detection TP-LINK CAMERA NC200 IP Cam e Videosorveglianza 0
A [Javascript] [HTML] Gestire una pagina esterna con 2 iframe Javascript 4
webmachine [PHP] gestire rinnovi PHP 1
P Gestire accesso ad un file xml pubblico PHP 1
D Gestire diversi tipi di pagamento per tipologia di cliente E-Commerce 4
asevenx Cerco plugin per gestire appuntamenti con agenda e campi di selezione WordPress 4
matteoraggi Software per gestire migliaia di permament redirect? SEO e Posizionamento 0
K Gestire response con servlet remota Sviluppo app per Android 1
P Piccolo software per gestire gli utenti. Snippet PHP 5
F Gestire data e ora PHP 6
D Gestire firme digitali con PHP PHP 0
C [Facebook Autolike]Software per gestire più account, mandare like, creare stati, amicizie e altro.. Vendere e Acquistare pubblicita' online 0
D gestire commenti e risposte ... PHP 3
asevenx Gestire posizionamento voci sottomenu che si nascondono HTML e CSS 1
N Programma per gestire Cookies secondo disposizioni del Garante Privacy 3/6/2014 G.U. 126 Leggi, Normative e Fisco 0
A Gestire e modificare immagini Java 2
M Gestire la chiusura forzata. Sviluppo app per Android 1
L Sito con doppia lingua. Gestire il cambio PHP 4
felino Wordpress e QTranslate: come gestire i widget WordPress 11
IImanuII Gestire lingua su facebook con php PHP 18
mondrian Gestire un web server su una virtualbox Apache 12
L gestire array per radio-checkbox in ciclo while PHP 2
MarcoGrazia Gestire gruppi e categorie di link con PHP PHP 1
L Button per gestire JS in WebBrowser di VBNet .NET Framework 0
A gestire errori 400-401-403-404-500 con file htaccess PHP 0
L classe per gestire login in mysql PHP 1
R Gestire sito creato da un altro webmaster HTML e CSS 10

Discussioni simili