Newsgroup: it.comp.www.php
Titolo: Problema con la criptazione di una strigna

Ciao a tutti.
Ho un problema con il mio Web Server: dopo aver effettuato una modifica (e
non ho ancora capito che tipo di modifica, credo che abbiano installato php
4.1.2) non mi funziona più la criptazione delle password degli utenti.
Mi spiego meglio:
sul mio pc (Win2000) ho installato apache con php4.0.6 se provo lo script di
login/registrazione funziona tutto correttamente, se invece mi collego al
sito, che fino a poco tempo fà funzionava correttamente, ecco che mi canna
la criptazione.
La funzione utilizzata è crypt() e sul sito c'è installato phpnuke 5.0.
Secondo voi cosa può essere? meglio ancora come cacchio posso fare per
risolvere il problema?
Per fare una prova ho creato uno script che mi cripta due parole e lo
caricato sia sul mio pc che sul server ecco i risultati:
Locale
Prima parola= ciccio
Criptata diventa = OikT9Du1UduJA
Seconda parola = pippo
Criptata diventa = MXfkpG//JMzaM
Sul server
Primo carattere = ciccio
Criptato diventa = $1$XAqDgp2P$pDGcPJIzAq64NPtSfQncu/
Secondo carattere = pippo
Criptato diventa = $1$BDIGLjda$HkYd92UX85WsIYtl8cMR11
Grazie a tutti.
--------------------------------------
Moderatore di 
http://ww.inbisac.com


Prova a dare lo stesso Salt a crypt. Pare che il server usi MD5 (per il
salt usato $1$). Cmq. non e' detto che devi ottenere stesso risultato
per sistemi operativi diversi.
Crypt puo cambiare comportamento/algoritmo in base al salt dato:
- DES devi dare solo due caratteri
- MD5 devi dare $1$ con 12 altri caratteri (attenzione single quote xke
$1$nomesalt interpreta la variabile, nei tuoi esempi ci sono
$1$XAqDgp2P$ e $1$BDIGLjda$
- Blowfish devi dare $2$ con 17 caratteri
in ogni caso sarebbe meglio se usi MD5 per ottenere compatibilita' tra
vari server.

 vari server.
A questo punto ti faccio un'altra domanda:
Perchè se io cripto una password sul mio pc e la "schiaffo" nel database sul
server utilizzando phpmyadmin dopo l'utente riesce ad accedere?
Di questo son sicuro perchè adesso devo fare così per permettere all'utente
di accedere, se lui però mi cambia la password ecco che siamo da capo.
Per quanto riguarda l'uso di MD5 ti dò ragione, ma pultroppo sul sito sono
iscritti circa 320 utenti, e non saprei come fare per fare la conversione
delle password anche perchè immagino che non ci sia un modo per decriptare
le password.

 Secondo voi cosa puň essere? meglio ancora come cacchio posso fare per


 ha scritto nel messaggio
news:GG0m8.47795$1S3.1...@twister1.libero.it...


 le password.
Impossibile, funzione senso unico.
Unico modo e assegnare nuove password ai utenti che se li cambiano dopo.

Allora per farti capire meglio ti scrivo qui sotto il codice:
Quando un utente si iscrive accade questo:
C'č una funzione che genera una password casuale:
function makePass() {
    $makepass="";
$syllables="er,in,tia,wol,fe,pre,vet,jo,nes,al,len,son,cha,ir,ler,bo,ok,tio,
nar,sim,ple,bla,ten,toe,cho,co,lat,spe,ak,er,po,co,lor,pen,cil,li,ght,wh,at,
the,he,ck,is,mam,bo,no,fi,ve,any,way,pol,iti,cs,ra,dio,sou,rce,sea,rch,pa,pe
r,com,bo,sp,eak,st,fi,rst,gr,oup,boy,ea,gle,tr,ail,bi,ble,brb,pri,dee,kay,en
,be,se";
    $syllable_array=explode(",", $syllables);
    srand((double)microtime()*1000000);
    for ($count=1;$count<=4;$count++) {
 if (rand()%10 == 1) {
     $makepass .= sprintf("%0.0f",(rand()%50)+1);
 } else {
     $makepass .= sprintf("%s",$syllable_array[rand()%62]);
 }
    }
    return($makepass);
}
Una volta controllati che i dati inseriti siano esatti viene cryptata ed
inserita :
...
 $makepass=makepass();
 if(!$system) {
     $cryptpass=crypt($makepass);
 } else {
     $cryptpass=$makepass;
 }
 $result = mysql_query("insert into $prefix"._users." values
(NULL,'','$uname','$email','','$url','$user_avatar','$user_regdate','$user_i
cq','$user_occ','$user_from','$user_intrest','$user_sig','$user_viewemail','
','$user_aim','$user_yim','$user_msnm','$cryptpass',10,'',0,0,0,'',0,'','$De
fault_Theme','$commentlimit', '0','$ric_mail')");
...
Quando l'utente prova a loggarsi viene effettuato il seguente controllo:
$result = mysql_query("select pass, uid, storynum, umode, uorder, thold,
noscore, ublockon, theme, commentmax from $prefix"._users." where
uname='$uname'");
    if(mysql_num_rows($result)==1) {
 $setinfo = mysql_fetch_array($result);
 $dbpass=$setinfo[pass];
 if(!$system) {
      $pass=crypt($pass,substr($dbpass,0,2));
 }
 if (strcmp($dbpass,$pass)) {
            Header("Location: user.php?stop=1");
         return;
 }
A me sembra tutto abbastanza ok.
Per quanto riguarda la soluzione di modificare il modo di cryptazione delle
password non posso poichč avendo piů di 300 utenti dovrei obbigargli a
cambiare password a tutti, il chč non č bello.


 cambiare password a tutti, il chè non è bello.
Io lo farei al tuo posto; meglio cambiare ora e ottimizzare il tutto che
tirarsi dietro questo Dinosauro e dover trovare una soluzione che
dopodomani non ti va di nuovo.
Per le password con mysql ti bastano due semplice query (non testato):
Inserimento password:
  INSERT INTO tabella ([...],pass) VALUES([...],PASSWORD($pass));
Per la verifica ti basta poi una query tipo:
  SELECT [...] FROM tabella WHERE uname='$uname' AND
pass=PASSWORD($pass);

 ha
scritto nel messaggio news:aP1m8.48028$1S3.1...@twister1.libero.it...
