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:
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");
}
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à.
Dove sbaglio?