ciao, stò facendo un piccolo sistema di storing della password utente criptandola con md5. In fase di creazione dell'account per evitare attacchi dictionary, aggiungo alla password un guid e cripto la password scelta dall'utente + il guid che poi inserisco anche come chiave univoca nel campo predefinito.
Quando vado a verificare il login, verifico il nome utente, recupero il suo guid e controllo che la password immessa nel campo + il guid corrispondano al dato binario nel campo di tipo oggetto OLE di un db access.. purtroppo però non riesco a controllarla.. mi viene fuori che non è stato trovato il record..
Vi scrivo un pò di codice.. evitando di farvi vedere come faccio la creazione dell'account in quanto la fase interessante sarebbe solo quella della creazione della password criptata, ma faccio lo stesso procedimento di quando controllo l'account..e controllo l'account in questo modo:
Come detto, quando vado a verificare la password mi esce fuori il messagebox "PASSWORD SBAGLIATA".. ma la password che inserisco è esattamente quella che ho inserito in fase di creazione dell'account e il guid dev'essere per forza quello perchè quando creo l'account mi preoccupo pure di controllare se il nome utente esiste già.codice://PARTENDO DALLO USERNAME CERCATO RECUPERO IL GUID (ID) CHE E' LA CHIAVE UNIVOCA CHE UNISCO ALLA PASSWORD IN FASE DI CRIPTAZIONE PER EVITARE ATTACCHI DICTIONARY cmd = new OleDbCommand("SELECT usrid,usr FROM Accounts WHERE usr = @user"); cmd.Connection = cn; OleDbParameter ctrlGuidusrpar = new OleDbParameter("@user", OleDbType.VarChar, 8); ctrlGuidusrpar.Value = txtUsn.Text; cmd.Parameters.Add(ctrlGuidusrpar); cn.Open(); string usrGUID = string.Empty; reader = cmd.ExecuteReader(); if (reader.Read()) { usrGUID = reader[0].ToString(); } else { MessageBox.Show("UTENTE NON TROVATO"); return; } reader.Close(); //DOPO AVER TROVATO IL GUID CONTROLLO SE L'ACCOUNT ESISTE cmd.CommandText = "SELECT COUNT(*) FROM Accounts WHERE usr = @user AND psw = @pw"; //parametro username OleDbParameter userpar = new OleDbParameter("@user", OleDbType.VarChar, 8); userpar.Value = txtUsn.Text; cmd.Parameters.Add(userpar); //md5 MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] hashedBytes; UTF8Encoding encoder = new UTF8Encoding(); //UNISCO ALLA PASSWORD IMMESSA IL GLOBALLY UNIQUE IDENTIFIER hashedBytes = md5.ComputeHash(encoder.GetBytes(txtPw.Text + usrGUID)); //parametro password OleDbParameter pwpar = new OleDbParameter("@pw", OleDbType.Binary, 16); pwpar.Value = hashedBytes; cmd.Parameters.Add(pwpar); //CONTROLLO SE NOME UTENTE E PASSWORD IMMESSE ESISTONO NEL DATABASE int iResult = (int)cmd.ExecuteScalar(); if (iResult == 1) { MessageBox.Show("ACCOUNT TROVATO"); } else { //A QUESTO PUNTO POSSO ESSERE SICURO CHE LA PASSWORD IMMESSA E'SBAGLIATA IN QUANTO HO GIA' CONTROLLATO PRIMA CHE IL NOME UTENTE ESISTE. E' QUINDI LA COMBINAZIONE NOME UTENTE E PASSWORD CHE NON ESISTE MessageBox.Show("PASSWORD SBAGLIATA"); }
Dove sbaglio?


Rispondi quotando
