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 Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    2,080

    Lettura di stringhe crittografate

    Dunque avevo fatto un bel sw, poi ho voluto migliorarlo e ovviamente non funziona più

    Dunque io salvo le mie pass sul db crittografandole così:
    Codice PHP:
    $password sha1($str); 
    Durante il login ne verifico la correttezza così:
    Codice PHP:
    if (strcmp($row['password'], $password) == 0) ... 
    ---

    Generando automaticamente le password ho notato che password di 5-6 caratteri funzionano, mentre quelle più lunghe no, come mai?
    Ho tolto i caratteri speciali come ! _ ecc... per escludere loro colpe al momento ho pass alfanumeriche.

    Grazie
    Sonia

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    sha1() restituisce un hash di 40 caratteri indipendentemente dalla lunghezza della stringa in input, quindi mi pare strano che "funzioni" per password corte e non per quelle lunghe. Mi sembrerebbe più un errore nel salvataggio della password sul database: sei sicura che la password in chiaro è quella che poi passi alla sha1() ?

    PS: Puoi anche confrontare le due stringhe direttamente senza usare la strcmp(): if($row['password'] == $password)

  3. #3
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    2,080
    Allora sul db ho messo il campo varchar 150 caratteri quindi la causa non è quella.
    Le pass le genero automaticamente in base al nome utente e delle stringhe random in questo modo.
    (metto il caso di un nome utente >= a 8 che è quello che mi da il problema)
    Codice PHP:
    if ((strlen($str))>=8) {
        
    $str substr($str,0,7);
        
    $str $str $caratteri[$c1];
        
    $str $str.rand (19);
      
    //  $str = $str . $sigle[$s1].rand (0,9);

    come vedete l'ultima riga è commentata!
    Se la scommendo la pass che genera non mi fa fare il login per "password errata".
    Ho provato ad aggiungere un altro numero random tra 1 e 9 (quindi un carattere) e continuava a funzionare, aggiungendo un secondo carattere non va più!
    Penso proprio sia una questione di lunghezza stringa.

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Sta cosa è strana a sentirla...ti sei stampata la password prima di passarla alla sha1() ?
    Poi, quel pezzo di codice in che contesto sta ?

  5. #5
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    2,080
    Si! La stampo e copio e incollo!
    In pratica lato admin c'è un pulsante "genera pass".
    In questa prima fase l'admin comunicherà la pass all'utente, successivamente vorrei che al "genera pass" la password venisse inviata via mail solo all'utente.
    Il codice completo e funzionante è questo!
    Codice PHP:
    $str $_POST["nominativo"];
    $caratteri = array ("-""_""!""$");
    $sigle = array ("GIO""VAN""gio""van");
    $c1 array_rand($caratteri1);
    $s1 array_rand($sigle1);
    $str str_replace(' '''$str);
    $str trim($str);
    if ((
    strlen($str))>=8) {
        
    $str substr($str,0,7);
        
    $str $str $caratteri[$c1];
        
    $str $str.rand (19);
        
    $str $str rand (0,9);
      
    //  $str = $str . $sigle[$s1].rand (0,9);
    } else if ((strlen($str))<=3) {
        
    $str $str $caratteri[$c1];
        
    $str $str.rand (2636);
        
    $str $str $sigle[$s1];
    } else {
        
    //$str = $str . $caratteri[$c1];
        //$str = $str.rand (10, 25). $sigle[$s1] . $caratteri[$c1];
        
    $str $str$caratteri[$c1]. $sigle[$s1].rand (09);
    }
    echo 
    "<p>La password per l'utente è:<br>"$str."</p><br><br><br>";
    $str sha1($str);
    $query "UPDATE utenti SET `password` = ? WHERE idutente = ".$_POST["id"];
    $result $connessione->prepare($query);
    $result->bind_param('s'$str);   
    $result->execute();
    $result->close(); 
    Quello che vedete commentato se lo scommento genera una pass troppo lunga e ho il problema.

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Giusto per sicurezza, hai controllato che l'hash generato sia effettivamente aggiornato ?
    Stampati l'hash e vedi se sul db corrisponde

  7. #7
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    2,080
    Codice PHP:
    echo "<p>La password per l'utente è:<br>"$str."</p><br><br><br>";
    $str sha1($str);
    echo 
    "'".$str."'"
    Qui è un caso da FBI!
    Ho fatto anche la prova che mi hai suggerito e confermo che $str che metto in output è lo stesso che va sul db. (Anche perchè non si spiegherebbe come mai le pass più corte funzionano)
    Avevo il dubbio sugli spazi e l'ho stampato tra virgolette e confermo che spazi non ce ne sono e quindi sul db non ci vanno a finire.
    Sul db è un varchar 150!

    Nota di servizio ho parametrizzato anche il post sull'idutente della query che mi era sfuggito.

    Grazie dell'interessamento!

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Fai una prova: lato login stampati l'sha1 della password che mandi via post è vedi se corrisponde a quella sul db

  9. #9
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    2,080
    Provo!
    Nel frattempo
    Codice PHP:
    echo strlen($str); 
    E confermo che sia le pass lunghe che le pass corte sono tutte di 40 caratteri!

  10. #10
    Utente di HTML.it L'avatar di Sonikag
    Registrato dal
    Mar 2004
    Messaggi
    2,080
    Fatto! e ovviamente non corrisponde!
    Però rimane il problema che le corte corrispondono e le lunghe no , il codice è strabanale e se ci fossero errori non andrebbe mai!

    Codice PHP:
    $qwt "SELECT * FROM utenti WHERE username =?";
    $stmt $connessione->prepare($qwt);
    $stmt->bind_param("s"$username);
    $stmt->execute();
    $result $stmt->get_result();
    if(
    $result->num_rows === 0) {echo 3;}

    while(
    $row $result->fetch_assoc()) {
            if (
    strcmp($row['password'], $password) == 0) {
                
    // in caso di successo creo la sesione e faccio le mie cosine
                // e stampo 1 (che identifica il successo)
                
    echo 1;
            }
            else{
                
    // in caso di comparazione non riuscita stampo due
                
    echo 2;
                }

    --
    Ho provato anche if($row['password'] == $password) {
    ma ho sempre lo stesso problema con le pass lunghe!
    Ultima modifica di Sonikag; 12-01-2018 a 19:49 Motivo: Aggiungo che...

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.