Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126

    evitare gli attacchi dictionary e utilizzo di md5

    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?

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Ma il campo che contiene la password è di tipo binario? Oppure è di tipo testuale?

    Potresti comunque ridurre il numero delle query estraendo direttamente tutti i dati che ti servono (nome utente, password, GUID, ecc.) e confrontandoli con quelli forniti in input o calcolati da questi, invece di usare un dato, eseguire un query e dai risultati della query eseguirne un'altra.

    Per il problema specifico, ipotizzo che si tratti di un problema di incompatibilità tra il parametro che è binario e contiene i byte del valore hash e il campo testuale che contiene appunto tale hash sottoforma di testo, ma servono ulteriori precisazioni e conferme per poter dire che è così.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Ma il campo che contiene la password è di tipo binario? Oppure è di tipo testuale?

    Potresti comunque ridurre il numero delle query estraendo direttamente tutti i dati che ti servono (nome utente, password, GUID, ecc.) e confrontandoli con quelli forniti in input o calcolati da questi, invece di usare un dato, eseguire un query e dai risultati della query eseguirne un'altra.

    Per il problema specifico, ipotizzo che si tratti di un problema di incompatibilità tra il parametro che è binario e contiene i byte del valore hash e il campo testuale che contiene appunto tale hash sottoforma di testo, ma servono ulteriori precisazioni e conferme per poter dire che è così.
    il campo che contiene la password è di tipo "oggetto OLE" che in access mi sembra di aver capito che serva a contenere dati binari..
    cosa vuoi sapere?

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Originariamente inviato da dops
    il campo che contiene la password è di tipo "oggetto OLE" che in access mi sembra di aver capito che serva a contenere dati binari..
    cosa vuoi sapere?
    Temo che non possa comparato con un semplice "=" come nel codice che hai postato, ma dovrei fare qualche prova per verificarlo.

    In genere, io preferisco sempre salvare la rappresentazione testuale dell'hash MD5: è più semplice da confrontare. Valuta eventualmente questa strada.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Temo che non possa comparato con un semplice "=" come nel codice che hai postato, ma dovrei fare qualche prova per verificarlo.

    In genere, io preferisco sempre salvare la rappresentazione testuale dell'hash MD5: è più semplice da confrontare. Valuta eventualmente questa strada.

    Ciao!
    scusa dove faccio questo semplice "=" ?
    cmq tu mi dici di salvare la forma testuale.. quindi in un campo testuale?

  6. #6
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    praticamente mi dici di fare una cosa del genere?
    codice:
                    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
                    byte[] hashedBytes;
                    UTF8Encoding encoder = new UTF8Encoding();
                    hashedBytes = md5.ComputeHash(encoder.GetBytes(txtPw.Text + globalID));
                    definitivepw = Convert.ToBase64String(hashedBytes);
    
                    OleDbParameter pwpar = new OleDbParameter("@pw", OleDbType.VarChar, 50);
                    pwpar.Value = definitivepw;
                    cmd.Parameters.Add(pwpar);
    memorizzando ovviamente in un campo di tipo testuale?
    se si.. conosci la lunghezza massima della conversione in stringa ( Convert.ToBase64String(hashedBytes) ) di un dato binario (byte[] hashedBytes) ?
    mi server per regolare la lunghezza del campo nel db..

  7. #7
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    uffa ma manco funziona cona la rappresentazione testuale.. che palle!!!!!!!

  8. #8
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    ao ma dove cacchio sbaglio (a parte il gradito suggerimento di utilizzare meno query):
    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));
                    string definitivepwLogin = Convert.ToBase64String(hashedBytes);
    
                    //parametro password
                    OleDbParameter pwpar = new OleDbParameter("@pw", OleDbType.VarChar, 50);
                    pwpar.Value = definitivepwLogin;
                    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");
                    }
    mi viene ritornato sempre che la password è sbagliata..!!!!!!
    eppure controllando i valori in fase di debug con quelli immessi nel database (con la forma testuale posso farlo perchè con il campo oggetto OLE non riuscivo a vederne il contenuto) sono praticamente uguali.. perchè l'executescalar mi ritorna 0 !!!!!!!

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,463
    Trasforma anche l'attuale campo OLE in un campo testo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  10. #10
    Utente di HTML.it L'avatar di dops
    Registrato dal
    Jul 2000
    Messaggi
    4,126
    Originariamente inviato da alka
    Trasforma anche l'attuale campo OLE in un campo testo.
    bhè ovviamente l'avevo già fatto.. altrimenti mi avrebbe dato un errore di conversione..
    porcaccia miseria!!!!!!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.