Newsgroup: it.comp.www.php
Titolo: Username e password in chiaro ?

Salve a tutti,
sto scrivendo un piccolo gestionale in ambiente php/mysql.
Per motivi pratici il server sarà su internet quindi mi sto occupando
della questione sicurezza.
La verifica di userid e password avviene confrontandoli con quelli in una
tabella 'utenti' di mysql. Mi stavo chiedendo: è corretto che nel db
questi dati siano in chiaro o è prassi criptarli in qualche modo ?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 questi dati siano in chiaro o è prassi criptarli in qualche modo ?
L'elaborazione avviene sul server, quindi grossi problemi di sicurezza non
ce ne sono.
Chiaramente se l'invio dei dati al server avviene in chiaro, qualcuno
potrebbe
sniffarli.
Potresti usare una connessione https ed inviare i dati codificati.
Un secondo step di sicurezza potrebbe essere quella di memorizzare nel db la
password codificata con un qualche algoritmo.
Poi quando l'utente la inserisce in chiaro, la codifichi e fai il test.
Per codificarla puoi farlo sul server (vedi https), oppure direttamente sul
client con JS.
Ciao
Marco

 client con JS.
non mi sembra una gran cosa mettere l'algoritmo della codifica delle
password su un file js, che per inciso è scaricabile e leggibile da tutti.


 questi dati siano in chiaro o è prassi criptarli in qualche modo ?
No, non è corretto.
Anticipo che di php mi sto occupando solo per diletto e da molto poco, ma
di sicurezza ho almeno le basi.
Le password non devono essere memorizzate tal quali, ma sotto forma di
hash.
In questo modo si risolve il problema degli attacchi dall'interno (chi ha
accesso al db?) e ci si tutela da intrusioni dall'esterno.
Per il resto puoi utilizzare una connessione sicura e, volendo,
sovrapporci il passaggio della pwd già cifrata.
Ripeto: non conosco le potenzialità del linguaggio e del db per cui il
gioco potrebbe non valere la candela.
Ciao


 password su un file js, che per inciso è scaricabile e leggibile da tutti.
Da ciò, non avertene a male, deduco che di sicurezza non ti sia mai stato
parlato.
Un noto principio di crittografia afferma che il metodo per cifrare un
dato DEVE essere pubblico perché lo scopo della cifratura è di rendere
altamente improbabile o troppo costoso risalire alla password partendo dal
cifrato.
Il metodo è sicuro di per sè: se la sicurezza del metodo dipende dalla
segretezza delle operazioni di cifratura (pieno stile Microsoft) il metodo
è debole per definizione.
Utilizza ciò che esiste già senza inventarti l'acqua calda ;).
Spero di aver chairito qlq.
Ciao


 Ciao
no in effetti non so un acca di crittografia. nè pur sforzandomi riesco a
capire bene come è possibile che pure avendo l'algoritmo di codifica sia
così difficile fare la decodifica.
problema che lascio cadere volentieri accontentandomi della tua
affermazione.


 e ci si tutela da intrusioni dall'esterno.
il php nel mio caso è solo un front grafico per vedere in impaginazione
decente i dati nel db e fare qualche semplice query. 
ma se un intruso ha già scoperto la password di accesso al db, che altro
gli serve? che se ne fa delle password utente dell'applicazione? già può
fare tutti i danni che vuole.
o mi sfugge qualcosa ?


 password su un file js, che per inciso è scaricabile e leggibile da tutti.
come algoritmo di cifratura puoi usare md5 che è sia in mysql che in 
php, e pure di script MD5 JS ne trovi facilmente con google.
il fatto che si veda il sorgente come ti hanno già detto non è un 
problema, anche perchè l'algoritmo è pubblico e usato in diversi sistemi.
ciao
-- 
Ranger! aggiungi .it all'indirizzo per rispondermi via mail
www.rossi.eu.com

 affermazione.
azz potevi dirmelo prima!! :)
ciao
Alesi_27

 ciao
MD5 non è un algoritmo di crittatura, piuttosto è una funzione hash che 
fà un "riassunto" dei dati.
ciao
Alesi_27

> azz potevi dirmelo prima!! :)
poi perdevo l'occasione di imparare qualcosa


 questi dati siano in chiaro o è prassi criptarli in qualche modo ?
esiste una pratica funzione che si chiama md5().
Io la uso per i miei script e la trovo sicura. Fra l'altro la sua dimensione
è sempre fissa (varchar di 32).
Basta che quando la salvi e quando fai il controllo per sapere se la
password è corretta metti la variabile dentro la funzione.
Questo algoritmo non ti permette di risalire alla password vera, hai solo
salvato l'md5, qundi se per caso venisse inviata e vista non c'è possibilità
che qualcuno la usi.
Ciao

 o mi sfugge qualcosa ?
l'utente medio tende ad usare la stessa password ogni qualvolta gli si 
presenti l'occasione: pass di connessione, pass di posta, pass di 
accesso a vari siti, pass di accesso al proprio sistema, infine, perchč 
no, pass di accesso al conto bancario online.
Un database di coppie login/password č il paradiso di ogni hacker
ciao
Alesi_27

Un ultimo suggerimento oltre a tutti quelli ottimi che ti hanno gia' 
dato .. io utilizzo nella pagina di login un javascript che fa l'md5 di 
username+password + session_id (questo mi da un'ulteriore grado di 
sicurezza perche' le "password" inviate +o- in chiaro sulla rete sono 
sempre diverse)
var hash_passwd = MD5(MD5(vuname+vpasswd) + session_id);
e lato server le verifica con
if ( $_POST['password'] != md5($opt['password'].session_id()) )
dove opt[password] e' quella memorizzata nel db ( che si ottiene da 
md5(uname+password)
ciao
Mauro

Sarebbe interessante, se non ancora affrontato, aprire un thread sulla
sicurezza e sicurezza - php.
Me ne intendo della prima, poco di php.
Ciao


 sicurezza e sicurezza - php.
sono d'accordo.
anche allargando il discorso a sql-injection, problemi di sicurezza con
register_globals=on ecc


cosě difficile fare la decodifica.
Be', considera l'operazione di somma.
7+2	= 9
Se la password e' 72, tu nel database metti 9.
Se io digito 35, il mio javascript lo codifica in 8, invia, e il server
capisce che la password e' sbagliata perche' 8 != 9.
L'algoritmo MD5, usato in questi casi, e' ancora meno invertibile, e ha
un rischio di "collisioni" trascurabile (il metodo della somma, invece,
collide parecchio: 18 da' lo stesso 'hash' di 72, cioe' 9, e quindi non
e' la password ma VIENE RICONOSCIUTO come se lo fosse).
In pratica, implementi l'MD5 in Javascript, e poi anziche' la password,
invii via HTTP
	MD5(data+ora+IP+MD5(password))
Il server ha nel database MD5(password), la data e l'ora le sa, e cosi'
genera il MD5 che tu "dovresti" inviare. Poi controlla se e' quello che
hai inviato. Se lo e', si presuppone che tu conosca la password.
Se uno "sniffa" quello che invii, vede un MD5 con cui ci fa il *brodo*,
perche' non puo' risalire alla password, e neppure al suo MD5. Inoltre,
non puo' usare l'hash perche' per lui non funziona (IP diverso), e dopo
pochi minuti l'hash smettera' di funzionare (cambiera' l'ora).
Se uno cracca il database, ci trova gli hash... quindi puo' loggarsi al
sito (de', tanto l'ha craccato...), ma non sapere le password. E questo
e' utile per quelli che usano la stessa pass per i blog e per investire
miliardi in Borsa :-)
Questo consente un login relativamente sicuro anche senza SSL... Certo,
poi i dati viaggiano in chiaro. A meno di non scrivere anche un decoder
in Javascript.
Leonardo
-- 
Time's angles, mages tell, conceal a place
incredible, beyond the mundane mind;
night-shrouded and between the seas of space
dread creatures drift in the ageless winds.

 hai inviato. Se lo e', si presuppone che tu conosca la password.
La data e l'ora del client in generale sono diversi da quelle server..
Il server semmai può inviare una challenge sotto forma di campo nascosto
del modulo di login ad esempio, e poi controllare che sia stata restituita
prima di qualche secondo.
--
If you are arguing with a fool,
chances are he's doing the same thing.

prima di qualche secondo.
Giusto. Sostanzialmente si sincronizza con il client. Questo sistema e'
anche migliore, se la challenge e' non riusabile e imprevedibile (
p.es
.
si puo' usare la data e l'ora del server concatenata ad un 'secret').
Magari si potrebbe realizzare una sorta di SSL via Javascript/PHP :-)
